Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于多对一关系休眠一对一映射,并应用最大值(日期)_Java_Hibernate_Hibernate Mapping - Fatal编程技术网

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>