【问题标题】:Why am I restricted to placing NamedQuery annotation only on an entity class为什么我只能在实体类上放置 NamedQuery 注释
【发布时间】:2015-07-23 01:59:40
【问题描述】:

放置命名查询注释的逻辑位置是在数据访问类上,该类处理为实体保存、检索等数据的逻辑。

但是,如果我将 NamedQuery 注释放在未使用 @Entity 标记的类上,Hibernate 会引发异常“没有为该名称定义查询”。

为什么 Hibernate 或 JPA 限制命名查询只能放在实体上?会不会是未来的功能?

有一些粗略的解决方法,例如使用 empty entity to hold queries,这让我觉得不被这样限制是有用的。我知道我可以使用 XML 配置,但对非实体的命名查询仍然有用。

【问题讨论】:

  • 一些 JPA 实现允许它们在任何类上,只是 JPA 规范和您选择的实现不允许
  • 如果将它们作为托管类添加到persistence.xml 会怎样?

标签: java hibernate jpa orm


【解决方案1】:

如果您检查JpaRepository,您可以看到您可以通过其他方式声明它们:

基于注解的命名查询配置

@Entity
@NamedQuery(name = "User.findByEmailAddress",
  query = "select u from User u where u.emailAddress = ?1")
public class User {

}

使用@Query在查询方法处声明查询

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);
}

【讨论】:

  • 这是 Spring 特有的功能吗?我不认为它是 JPA 或 Hibernate 的一部分。
  • 感谢您的链接。如果不使用 Spring,您知道任何解决方案吗?
  • 看看这个:stackoverflow.com/questions/602397/… 您可以将查询添加到package-info.java 文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 2011-12-20
相关资源
最近更新 更多