JPA为什么要使用createNamedQuery

我正在使用Hibernate API将DAO层更改为使用纯JPA API实现。 看起来推荐的方法是使用实​​体管理器中的createNamedQuery。 命名查询存储在模型/实体类的注释中。 这对我来说没有意义。 为什么要在模型对象中定义JPA查询,但在DAO中使用它们。 从DAO本身使用createQuery并在DAO中定义查询甚至只是在DAO本身中定义命名查询是不是更有意义?

对于那些使用JPA API实现DAO层的人,您如何定义查询?

我使用命名查询。

这样做有两个原因:

  1. 它将它们放在一个更中心的位置,而不是随机的createQuery()调用分散在代码中; 和
  2. 构建过程可以validation查询(非常有用)。

你可以看一下Spring Data JPA 。 它允许您简单地定义接口并执行查询,而无需手动实现执行。

实体:

@Entity @NamedQuery(id="User.findByLastname" query="from User u where u.lastname = ?1") public class User implements Persistable { @Id private Long id; private String username; private String lastname; private int age; } 

库:

 public interface UserRepository extends CrudRepository { // Will trigger the NamedQuery due to a naming convention List 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 findByAgeGreaterThan(int age); } 

建立:

 EntityManager em = Persistence.getEntityManagerFactory().createEntityManager(); JpaRepositoryFactory factory = new JpaRepositoryFactory(em); UserRepository repository = factory.getRepository(UserRepository.class); 

如您所见,您可以选择不同的方法来派生要从该方法执行的查询。 虽然直接从方法名称派生它对于简单查询是可行的,但您可能会在@NamedQuery (JPA标准)或@Query (Spring Data JPA注释)之间进行选择,这取决于您希望遵守标准的程度。

Spring Data JPA为您提供了对数据访问层实现的各种其他角落的支持,允许为方法提供自定义实现并与Spring很好地集成。

我的经历与克利特斯完全相反 – 我发现没有任何好处,也发现它们使用起来很尴尬。 琐碎的查询在定义的位置没有区别,但是非平凡的查询通常很难与任何单个实体相关联,但使用面向业务的方法很容易。

如果您在DAO中使用更多或更少的复杂基础架构(用于重用和一致性),那么使用命名查询往往会使实现和可读性复杂化,而且没有明显的优势。

通过构建过程validation查询听起来很有趣 – 我想知道更多它的真正含义…我的查询几乎没有错误的余地,因为每个DAO方法都经过unit testing,因为它是有意义的。

不要只是在任何地方使用命名查询,有些情况下它们不合适,例如当它很少使用查询时,根据需要构建它可能更有效。

当命名查询复杂并经常执行时,它会更有意义。

[更新]

您可以在映射时编写命名查询。

拥抱和:)的力量如果你有一个有意义的查询放入模型,那么这样做。 如果你不这样做,不要。 问“你为什么用JPS写DAO?”可能更好? 如果答案是“将我的代码与数据库隔离”。 这是由实现JPA的库完成的。 如果答案是“将我的代码与我持久化的方式的变化隔离开来”,那么JPA允许您实现不同的实现。 我使用查询对象进行复杂查询,并且尽可能使用命名查询,我喜欢命名查询被编译的事实,因此我发现它们中的错误要快得多。 我没有DAO层。

    Interesting Posts