Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails自关系中的递归抓取_Grails_Gorm_One To Many_Grails Domain Class - Fatal编程技术网

Grails自关系中的递归抓取

Grails自关系中的递归抓取,grails,gorm,one-to-many,grails-domain-class,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 } 我想写一个可以做两件事的查询 如果一条消息是父消息,即它不是对任何其他消息的答复,则检索一个以该消息开始建立对话的消

我有以下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
    
  • 给定一条作为回复的消息,对于另一条消息,还要构建一个与上面相同的列表,包括给定消息(回复)所属的父级


  • 我已经考虑过这一点,但无法想出一种可行的方法,因为没有
    对话
    域类将属于同一对话的消息联系在一起。因此,我希望有某种递归查询可以帮助我实现这一点。

    有两种方法可以处理这种类型的结构,而且web上也不乏关于这种基于树的关系的示例

    class Message {
        static hasMany = [replies: Message]
    
        Message isReplyTo
        User author
        String title
        String text
        Date createdAt
        Date lastUpdated
    }
    
    用最简单的方法;您可以有一个
    父级
    子级
    结构,其中
    null
    父级将表示树的顶部,“null”子级将表示该分支的结束。这是一个简单而有效的结构,但是很难捕获度量,因为您总是必须递归地搜索整个线程

      Message{
        ...
        Message parent
        Message child
      }
    
    post在GSP示例中显示了一个良好的递归:

    另一种模式是物化路径。实施起来有点小技巧,但一旦到位,就很容易实现。具体化的路径也更容易收集回复数量等指标,而且做面包屑也更容易

      Message{
        ...
        Message parent
        String path //would like something like this: 1/2/3/4
      }
    
    有关具体化路径搜索的示例,请查看google或post