休眠命名查询

Posted

技术标签:

【中文标题】休眠命名查询【英文标题】:hibernate named queries 【发布时间】:2011-01-18 19:28:06 【问题描述】:

在休眠中,当我们这样做时,session.getNamedQuery(QUERY_NAME),我们不需要传入存储命名查询的 hbm.xml 文件的名称。 cfg 文件中提到了 hbm.xml 的名称。

问题是,如果命名查询有 5 个 hbm.xml 文件,并且查询名称存在名称冲突(即所有 5 个文件中的 QUERY_NAME 相同),hibernate 将如何解决它?

直观地说,在执行 session.getNamedQuery(QUERY_NAME) 之前,应该需要显式加载写入查询的特定 hbm.xml 文件。

【问题讨论】:

【参考方案1】:

Hibernate 将所有已加载的 hbm 文件中的所有命名查询聚合在一个逻辑命名空间下(将其视为以名称为键但在 put(..) 之前对键进行重复检查的 Map)。因此,名称在给定的会话工厂中应该是唯一的。因此,请确保您的所有命名查询都是唯一的。

【讨论】:

谢谢。您认为这是一个直观的功能吗?这意味着如果我在 java 代码中遇到命名查询引用,我需要检查每个映射文件。 这表现出快速失败的行为,这意味着当休眠 cfg 发现重复名称时抛出启动前。所以是的,这很直观【参考方案2】:

除了Pangea的回答:如果你想在不同的.hbm.xml文件中有相同查询的不同版本并在它们之间进行选择,你可以通过在构造SessionFactory时调用Configuration.addFile()/Configuration.addInputStream()来实现(尽管在 SessionFactory 初始化期间只能执行一次,因此您无法即时更改它们)。

【讨论】:

【参考方案3】:

虽然这并不能直接解决问题,但通常的做法是为您的查询提供反映它们处理的包和实体的名称,以避免命名冲突。而不是“findUser”,您可能会有类似“com.myproject.domain.User.findByUsernameAndPassword”的内容

【讨论】:

以上是关于休眠命名查询的主要内容,如果未能解决你的问题,请参考以下文章

休眠中命名查询的优点?

命名查询休眠

休眠命名查询不知道错误

具有聚合函数的休眠命名查询

使用休眠命名查询和弹簧填充 DTO 的列表属性

使用 Like 和 % % 运算符的休眠命名查询?