如何声明命名查询超越 Hibernate 实体类?

Posted

技术标签:

【中文标题】如何声明命名查询超越 Hibernate 实体类?【英文标题】:How to declare named queries oustide Hibernate entity classes? 【发布时间】:2011-03-13 01:30:42 【问题描述】:

我有一个数据访问类,它公开了网站上使用的实体类的基本操作:

public class UserDataAccessService 

   public User login(User u)...
   public User findByUsername(String username)...

我想在这个数据访问类中定义所有 HQL/SQL 查询,但是我在使用休眠 @NamedQuery 注释时遇到了问题; Hibernate 一直说它找不到命名查询。我不打算在实体类中定义查找/查找方法,因为我觉得它不是合适的位置。

我只使用注解和 hibernate.cfg.xml,那么我在哪里可以声明这些查询以便 Hibernate 可以找到它们?

【问题讨论】:

【参考方案1】:

如果您使用@MappedSuperclass 注释您的DAO,那么您可以将您的NamedQueries 放入DAO。不要忘记将 DAO 的包或 DAO 类本身添加到 Hibernate 配置中带注释的包/类列表中

【讨论】:

【参考方案2】:

您可以在相应的 XML 映射文件中编写查询。

//---
<query name="findUser"><![CDATA[select o from User o]]>
</query>
//---

编辑:

命名原生查询:

<sql-query name="findUser">
<return alias="user" class="com.User"/>
//-- native query
</sql-query>

来自文档:

命名的 SQL 查询可以定义在 映射文档并调用 与命名 HQL 完全相同的方式 查询。

这些查询需要放在各自的映射(hbm.xml)文件中。

【讨论】:

hibernate.cfg.xml 中没有“查询”元素,所以这不是一个选项。 @user646584 :查询元素需要放置在映射文件(hbm.xml)中,而不是您尝试执行的配置文件(cfg.xml)中。无论如何编辑我的答案可能会对你有所帮助。

以上是关于如何声明命名查询超越 Hibernate 实体类?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在实体类和 package-info.java 中定义命名查询?

Hibernate-ORM:14.Hibernate中的命名查询

org.hibernate.MappingException 命名查询未知

改进的命名策略不再在 Hibernate 5 中工作

hibernate 中的ORM是如何与数据库实现存储和查询的

hibernate用注解配置实体类的映射