Rug*_*ggs 14 java hibernate jpa data-access-layer
我正在使用Hibernate API将DAO层更改为使用纯JPA API实现.看起来推荐的方法是使用实体管理器中的createNamedQuery.命名查询存储在模型/实体类的注释中.这对我来说没有意义.为什么要在模型对象中定义JPA查询,但在DAO中使用它们.从DAO本身使用createQuery并在DAO中定义查询甚至只是在DAO本身中定义命名查询是不是更有意义?
对于那些使用JPA API实现DAO层的人,您如何定义查询?
cle*_*tus 13
我使用命名查询.
这样做有两个原因:
Oli*_*ohm 11
你可以看一下Spring Data JPA.它允许您简单地定义接口并执行查询,而无需手动实现执行.
实体:
@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;
}
Run Code Online (Sandbox Code Playgroud)
库:
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);
}
Run Code Online (Sandbox Code Playgroud)
建立:
EntityManager em = Persistence.getEntityManagerFactory().createEntityManager();
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);
UserRepository repository = factory.getRepository(UserRepository.class);
Run Code Online (Sandbox Code Playgroud)
如您所见,您可以选择不同的方法来派生要从该方法执行的查询.虽然直接从方法名称派生它对于简单查询是可行的,但您可以在@NamedQuery(JPA标准)或@Query(Spring Data JPA注释)之间进行选择,这取决于您希望遵守标准的程度.
Spring Data JPA为您提供数据访问层实现的各种其他角落的支持,允许为方法提供自定义实现并与Spring很好地集成.
我的经历完全与克莱图斯相反 - 我发现没有任何好处,也发现它们使用起来很尴尬.琐碎的查询在定义的位置没有区别,但是非平凡的查询通常很难与任何单个实体相关联,但使用面向业务的方法很容易.
如果您在DAO中使用或多或少复杂的基础结构(用于重用和一致性),那么使用命名查询往往会使实现和可读性复杂化,而且没有明显的好处.
通过构建过程验证查询听起来很有趣 - 我想知道更多它的真正含义...我的查询几乎没有错误的余地,因为每个DAO方法都经过单元测试,因为它是有意义的.
| 归档时间: |
|
| 查看次数: |
20466 次 |
| 最近记录: |