Java 为什么我只能在实体类上放置NamedQuery注释

Java 为什么我只能在实体类上放置NamedQuery注释,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,命名查询注释位于数据访问类上,该类处理实体的保存、检索等数据的逻辑 但是,如果我在未标记为@Entity的类上放置NamedQuery注释,Hibernate会抛出一个异常“没有为该名称定义查询” 为什么Hibernate或JPA限制命名查询只放在实体上?它会成为未来的特色吗 有一些粗略的解决方法,例如使用 ,这使我认为不受这样的限制是有益的。我知道我可以使用XML配置,但对非实体的命名查询仍然很有用 如果您选中,您可以看到您可以用其他方式声明它们: 基于注释的命名查询配置 @Entity @N

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

但是,如果我在未标记为@Entity的类上放置NamedQuery注释,Hibernate会抛出一个异常“没有为该名称定义查询”

为什么Hibernate或JPA限制命名查询只放在实体上?它会成为未来的特色吗

有一些粗略的解决方法,例如使用 ,这使我认为不受这样的限制是有益的。我知道我可以使用XML配置,但对非实体的命名查询仍然很有用

如果您选中,您可以看到您可以用其他方式声明它们:

基于注释的命名查询配置

@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);
}
public interface UserRepository扩展了JpaRepository{
@查询(“从用户u中选择u,其中u.emailAddress=?1”)
用户findByEmailAddress(字符串emailAddress);
}

这是弹簧特有的功能吗?我不认为这是JPA或Hibernate的一部分。谢谢你的链接。如果不使用Spring,您知道有什么解决方案吗?看看这个:您可以将查询添加到
包信息.java
文件中。一些JPA实现允许它们位于任何类上,只是如果您将它们作为托管类添加到
persistence.xml
中,JPA规范和您选择的实现不会发生什么?