我有以下grails域类,其中包含一个自我关系。
class Message {
static hasMany = [replies: Message]
Message isReplyTo
User author
String title
String text
Date createdAt
Date lastUpdated
}
我想写一个可以做两件事的查询
如果一条消息是父项,即它不是对其他任何消息的答复,请检索从该消息开始建立对话的消息列表。
Message 1
---- Reply 1
---- Reply 2
-------- SubReply 1
给出的消息是对另一条消息的答复,还建立了与上述相同的列表,包括给定消息(答复)所属的父级。
我已经考虑过这一点,但是还没有想到一种可行的方法,因为没有Conversations
域类将属于同一对话的消息绑定在一起。因此,我希望有某种递归查询可以帮助我实现这一目标。
答案 0 :(得分:2)
有几种方法可以处理这种类型的结构,并且在网络上也不乏有关这种基于树的关系的示例。
以最简单的方法;您可能具有Parent
Child
结构,其中null
的父级将指示树的顶部,而'null'的子级将指示该分支的结束。这是一个简单有效的结构,但是捕获指标可能很困难,因为您将始终需要递归搜索整个线程。
Message{
...
Message parent
Message child
}
This帖子在GSP示例中显示了良好的递归:
为此的另一种模式是物化路径。实施起来有些麻烦,但是一旦安装就可以轻松进行。物化路径也更容易收集指标(例如回复计数),并且进行面包屑也容易得多。
Message{
...
Message parent
String path //would like something like this: 1/2/3/4
}
有关实例化路径搜索的示例,请查看google或this帖子。