Java 基于多对一关系休眠一对一映射,并应用最大值(日期)
我有一个映射的Java 基于多对一关系休眠一对一映射,并应用最大值(日期),java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我有一个映射的消息对象,它与自身有父子关系。因此,每条消息都包含一条设置注释。除了注释外,我还想与最后一条注释建立一对一的关系,以便在我的标准中使用最后一条注释。在SQL中,我建立了如下类似的方法(任何注释都不能有相同的postDate,因此这不会导致双重匹配): 现在我想知道如何在HibernateXML映射中设置它,但不确定如何使用formula属性,或者是否应该使用其他机制。我希望下面的方法能奏效,但没有 <one-to-one name="latestComment"
消息
对象,它与自身有父子关系。因此,每条消息
都包含一条设置注释
。除了注释外,我还想与最后一条注释建立一对一的关系,以便在我的标准中使用最后一条注释。在SQL中,我建立了如下类似的方法(任何注释都不能有相同的postDate,因此这不会导致双重匹配):
现在我想知道如何在HibernateXML映射中设置它,但不确定如何使用formula属性,或者是否应该使用其他机制。我希望下面的方法能奏效,但没有
<one-to-one name="latestComment"
class="Message"
cascade="none"
property-ref="parent"
formula="postDate=(MAX(allComments.postDate) FROM messages allComments WHERE allComments.parentId=id)"
lazy="proxy">
</one-to-one>
通过这种映射,只要只有一条注释,我就可以得到我想要的结果。但论坛完全被忽视了。我所举的例子似乎都是使用简单公式在不同列上的映射,而不是使用子查询
期待一些提示我可能在这里完全错了(如果我错了,请原谅),但我忍不住觉得,数据库上的触发过程可能会更好地处理您试图处理的场景。让数据库引擎自己处理更新指向“最近”注释的指针。这样你就不会有一个潜在的昂贵的MAX函数——你只需查看postDate就可以得到这个注释。公式是一个SQL表达式,而不是HQL,所以你的公式无法使用
在这些情况下,我要做的是遍历集合以找到所需的目标实体。否则,您将增加查询的复杂性,从而使对象失去实际价值
您已经获取了最新的评论,为什么要强制获取两次呢?嗨,Richard,谢谢您的回复。你可能最终是对的。我真的很喜欢独立于dbms的选项。除非我不知道hibernate设置触发器的方法,否则我需要将自己绑定到特定的dbms或维护多个构建脚本。啊,这些是拦截器和事件。不太清楚为什么我以前没有想到这一点。我仍然对我的问题的实际答案感兴趣,所以我会让它再开放一段时间。现在,你已经为我指明了正确的方向。hibernate事件是我将继续进行这项工作的方式。谢谢没问题。很高兴我能提出一些有用的建议。啊,我将尝试使用纯sql而不是HQL。谢谢在我的例子中,我不想迭代结果,因为我的目标是在父消息查询中使用最新注释的值。这可能会导致非常昂贵的java循环过程,而SQL就是用来优化这个过程的。我的注释是惰性加载的,因此如果我确实将注释打印到我的页面,我只会获取它两次。公式
用于指定与子项/property-ref匹配的父主键以外的其他值。您不能通过公式在候选子项之间进行筛选。它看起来不像一对一
当前支持此属性。看见
<one-to-one name="latestComment"
class="Message"
cascade="none"
property-ref="parent"
formula="postDate=(MAX(allComments.postDate) FROM messages allComments WHERE allComments.parentId=id)"
lazy="proxy">
</one-to-one>