Grails自我关系中的递归获取

时间:2018-11-28 09:42:42

标签: grails gorm one-to-many grails-domain-class

我有以下grails域类,其中包含一个自我关系。

class Message {
    static hasMany = [replies: Message]

    Message isReplyTo
    User author
    String title
    String text
    Date createdAt
    Date lastUpdated
}

我想写一个可以做两件事的查询

  1. 如果一条消息是父项,即它不是对其他任何消息的答复,请检索从该消息开始建立对话的消息列表。

    Message 1
    ---- Reply 1
    ---- Reply 2
    -------- SubReply 1
    
  2. 给出的消息是对另一条消息的答复,还建立了与上述相同的列表,包括给定消息(答复)所属的父级。

我已经考虑过这一点,但是还没有想到一种可行的方法,因为没有Conversations域类将属于同一对话的消息绑定在一起。因此,我希望有某种递归查询可以帮助我实现这一目标。

1 个答案:

答案 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帖子。