我有一个映射的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,因此您所表达的公式不起作用。
在这些情况下,我所做的是遍历集合以找到所需的目标实体。否则,您会增加查询的复杂性,从而使对象水合而没有实际价值。
你已经在获取最新的评论了,为什么要强制获取两次呢?