gpt4 book ai didi

grails - withCriteria获取关联对象的列表

转载 作者:行者123 更新时间:2023-12-02 15:05:33 25 4
gpt4 key购买 nike

我是Grails的新手,并且很难理解数据库标准。

任何人都可以提供以下帮助:

这是我的域结构:

-评论
-评论组
- 评论

所以我的域类看起来像(简化):

class Comment {
String commentTitle
String comment
CommentGroup commentGroup
static hasMany = [commentGroups:CommentGroup]
static constraints = {
commentGroup nullable:true
}
}

class CommentGroup{
String groupTitle
static constraints = {
groupTitle blank:true, nullable:true
}
}

因此,我的注释可以包含许多commentGroup,而注释组又可以具有许多注释,但是我的commentGroup上没有hasMany Comments。相反,我通过为注释分配一个commentGroup来将注释与组关联。

这已正确保存到MySQL DB,并且我设法使用以下代码通过commentGroups撤回了注释:
    def testimonialList = Comment.withCriteria {
eq 'approved', true
isNull 'commentGroup'
order('dateCreated', 'desc')
order('displayPriority','desc')
maxResults max
firstResult offset
}

我现在需要实现的是,通过将当前Comment CommentGroup与关联的Comment CommentGroup匹配,将每个当前Comment CommentGroup的所有Comment撤回,并将它们保存在每个CommentGroup下的列表中。

因此,我最终得到一个类似于以下内容的对象结构:
Comment
CommentGroup1
Comment1
Comment2
Comment3
CommentGroup2
Comment1
Comment2
Comment3

谁能帮助我完成我的条件查询以实现这一目标。

先感谢您。

最佳答案

为了获得想要的结果,您将需要一种不同的方法。

问题

您将域模型描述为:注释-1 ----- n--CommentGroup-1 ----- n--注释

如果是这种情况,您将可以轻松实现目标。但实际上您拥有的是: Comment-1 ----- n--CommentGroup-n ----- 1--Comment

由于CommentGroup没有对其Comment的引用,因此从CommentGroup变为Comment是一个挑战。

寻求解决方案

对于给定的CommentGroup,您可以像这样获得其Comment:

def comments = Comment.withCriteria {
eq('commentGroup', commentGroup)
}

如果您有 CommentGroup的列表,则可以像这样获得所有的 Comment:
def comments = Comment.withCriteria {
inList('commentGroup', commentGroups)
}

因此,您必须:
  • 运行查询以获取您感兴趣的Comment的列表。
  • 使用这些.commentGroupsComments属性获取CommentGroup的列表。
  • 运行第二个查询以获取CommentCommentGroup
  • 将所有内容组合成所需的结构;可能使用嵌套的Map

  • 前三个步骤如下所示:
    def comments = Comment.withCriteria {
    eq 'approved', true
    isNull 'commentGroup'
    ...
    }

    def commentGroups = comments*.commentGroups

    def comments = Comment.withCriteria {
    inList('commentGroup', commentGroups)
    }

    更好的方法

    使用适合于此目的的关联,创建您描述的域模型会容易得多:
    class Comment {
    String commentTitle
    String comment
    static belongsTo = CommentGroup
    static hasMany = [commentGroups:CommentGroup]
    static constraints = {
    commentGroup nullable:true
    }
    }

    class CommentGroup{
    String groupTitle
    static hasMany = [comments: Comment]
    static constraints = {
    groupTitle blank:true, nullable:true
    }
    }

    使用此模型,一旦获得了 Comment,就可以获取其 CommentGroupComment
    def otherComments = comment.commentGroups*.comments

    但是,要更接近所需的输出,使用HQL会更好。这是因为条件查询无法投影根实体。例如,如果您像这样查询 Comment: Comment.withCriteria {...},则可以返回那些 Comment s(根实体,这是默认行为),或者可以投影 Comment的属性。是/或。但是HQL没有此限制。
    def hql = """
    SELECT c, cgs, cs
    FROM Comment as c
    INNER JOIN c.commentGroups as cgs
    INNER JOIN cgs.comments as cs
    WHERE c.approved = true
    // Ignoring, c.commentGroup IS NULL, because it doesn't make sense.
    ORDER BY c.dateCreated DESC, c.displayPriority DESC
    """

    def result = Comment.executeQuery(hql, null, [maxResults: max])

    结果看起来像这样:
    [
    [Comment 1, CommentGroup 1, Comment x],
    [Comment 1, CommentGroup 1, Comment y],
    [Comment 1, CommentGroup 1, Comment z],
    [Comment 1, CommentGroup 2, Comment a],
    [Comment 1, CommentGroup 2, Comment b],
    [Comment 1, CommentGroup 2, Comment c],
    [Comment 2, ...],
    ]

    基本上是您要的结构,但会作为查询结果集展平。

    我有一个有关如何查询GORM关联的 article,在此我演示了关联对您可以创建的查询的影响。我认为您会发现它对了解标准查询很有帮助。

    关于grails - withCriteria获取关联对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33455017/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com