查询grails树对象

时间:2013-05-22 09:50:32

标签: grails hql gorm

我有一个看起来像这样的Section域。我从它构建导航并在部分或子部分下订购故事,例如:news>犯罪>伟大的火车抢劫

class Section {
    String name;
    String path
    Section parent;
    Boolean active = true;
    int level = 0;
    Boolean isRoot = false;
    static hasMany = [children:Section]
    static mappedBy = [children:'parent']
    static mapping = {
        parent :'all-delete-orphan' 
        parent lazy:true
    }
}

看起来像这样的Story域

    class Story 
    {
        String title;
        String story;
        List link;
        List substory;
        List picture;
        Section publishUnder
        boolean parent = false;
        boolean approved = false;

        Date dateCreated;
        Date lastUpdated;

        static belongsTo = [author:Author]

        static hasMany=
        [
           link:String,
           substory:Story,
           picture:Picture
        ]
   }

我们有7个根部分:

家庭,新闻,体育,旅游,科技,文化和评论,除了家庭,他们都有儿童部分

例如:新闻将低于其中包含英国,欧洲和美国的水平,然后美国可能会有另一个级别的子部分用于包含政治和犯罪部分。如上所述的故事存储在章节下。所以一个“奥巴马被迫”的故事将在其价值下公布 新闻>美国>政治即可。

我必须编写一个查询,它将获得n个故事,这些故事存储在顶级部分的一个子节点下。因此,如果我将“新闻”部分作为参数传递(可能没有任何故事直接存储在“新闻”下,但可能存在新闻>英国>犯罪)我想要返回故事存储在“新闻”的任何子部分下

我如何用gorm做到这一点?我应该使用HQL吗?我仍然是一个菜鸟,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

你可以有这样一个简单的解决方案:

首先,为了加快速度,我会在内存缓存中有一个Sections Tree。启动应用程序时,可以创建此树并将其存储在applicatin上下文中: 在grails-app / conf / BootStrap.grrovy中,您可以在init closure

中执行此操作
def init = { servletContext ->
    servletContext.sectionsTree = something
}

要创建这个“东西”,你可以递归地遍历子节点,并构建一个包含每个节的所有子ID的列表或映射......类似于:

rootSections = [[section:root1, childrenIds:[23,45,67,89,5,43,45,6,7,87], children:[section:child1, childrenIds:[23,45,67]]], [section:root2, childrenIds:[32,43,54,65,76], children:[]]]

其中childrenIds包含子节点和子节点的所有ID。

现在,您可以执行一个简单的HQL查询来获取Section的故事:

Story.executeQuery("select s from Story s where s.publishUnder.id in (?)", [childrenIds]);

这只是一个解决方案....你对它的看法。

干杯