如何声明命名查询超越 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 命名查询未知