JPA 为什么使用 createNamedQuery

2022-09-03 09:39:55

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

对于那些已经使用JPA API实现DAO层的人来说,你如何定义你的查询?


答案 1

我使用命名查询。

这样做有两个原因:

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

答案 2

你可以看看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;
}

存储 库:

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);
}

设置:

EntityManager em = Persistence.getEntityManagerFactory().createEntityManager();
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);

UserRepository repository = factory.getRepository(UserRepository.class);

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

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


推荐