基于与MAX(日期)应用的多对一关系的休眠一对一映射

时间:2011-06-21 16:20:35

标签: java hibernate hibernate-mapping

我有一个映射的Message对象,它与自身有父子关系。因此,每个Message都拥有Set<Message> comments。除了评论之外,我还想与最后一条评论建立一对一的关系,以便我可以使用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映射中设置它,但我不确定如何使用公式属性或者我应该使用不同的机制。我希望以下内容可行,但事实并非如此。

<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>

只要只有一条评论,我就可以得到我想要的结果。但论坛被完全忽略了。我的例子似乎都使用简单的公式只是映射到不同的列,而不是使用子查询。

期待一些指示

2 个答案:

答案 0 :(得分:1)

我可能完全错了(请原谅我,如果我的话),但是我不禁感到你试图处理的情景可能会被触发的程序更好地服务于数据库。让数据库引擎本身处理更新指向“最新”注释的指针。这样你就没有一个可能很昂贵的MAX功能 - 你只需看看该评论的postDate。

答案 1 :(得分:1)

公式是一个SQL表达式,而不是HQL,因此表达式的公式将不起作用。

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

您已经提取了最新的评论,为什么要强制它被提取两次?