Puedes echar un vistazo al Spring Data JPA. Le permite simplemente definir una interfaz y ejecutar consultas sin la necesidad de implementar la ejecución de forma manual.
Entidad:
@Entity
@NamedQuery(id="User.findByLastname" query="from User u where u.lastname = ?1")
public class User implements Persistable<Long> {
@Id
private Long id;
private String username;
private String lastname;
private int age;
}
Repositorio:
public interface UserRepository extends CrudRepository<User, Long> {
// Will trigger the NamedQuery due to a naming convention
List<User> findByLastname(String lastname);
// Will create a query from the methodname
// from User u where u.username = ?
User findByUsername(String username);
// Uses query annotated to the finder method in case you
// don't want to pollute entity with query info
@Query("from User u where u.age > ?1")
List<User> findByAgeGreaterThan(int age);
}
Configuración:
EntityManager em = Persistence.getEntityManagerFactory().createEntityManager();
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);
UserRepository repository = factory.getRepository(UserRepository.class);
Como se puede ver se puede elegir entre diferentes maneras para obtener la consulta, para la ejecución del método .Si bien derivarlo directamente del nombre del método es factible para consultas simples, probablemente elija entre @NamedQuery
(estándar JPA) o @Query
(anotación Spring Data JPA) dependiendo de cuánto le gusta cumplir con los estándares.
Spring Data JPA le brinda soporte en varias otras esquinas de la implementación de la capa de acceso a datos, permite proporcionar implementaciones personalizadas para los métodos y se integra muy bien con Spring.
¿Por qué la ubicación central debería ser el objeto modelo frente al DAO que realmente lo está utilizando? – Ruggs
Me olvidé de mencionar que estas consultas con nombre que normalmente pongo en la entidad. Si la consulta cruza varias entidades, solo elige la más relevante. – cletus