基于多对一关系的Hibernate一对一映射,并应用MAX(日期)



我有一个映射的Message对象,它本身具有父子关系。因此,每个CCD_ 2保持一个CCD_ 3。除了注释之外,我还想与最后一条注释建立一对一的关系,这样我就可以在Criteria中使用最后一条评论。在SQL中,我这样建立(没有注释可以有相同的postDate,所以这不会导致我的双重匹配):

SELECT 
    parentM.*, 
    lastComment.* 
FROM 
    messages parentM 
    left outer join messages lastComment ON 
        lastComment.parentId=parentM.messageId AND 
        lastComment.postDate=(SELECT MAX(subM.postDate) FROM messages subM WHERE subM.parentId = parentM.messageId); 

现在我想知道如何在Hibernate xml映射中设置它,但不确定如何使用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,因此您所表达的公式不起作用。

在这些情况下,我所做的是遍历集合以找到所需的目标实体。否则,您会增加查询的复杂性,从而使对象水合而没有实际价值。

你已经在获取最新的评论了,为什么要强制获取两次呢?

最新更新