我有一个看起来像这样的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吗?我仍然是一个菜鸟,所以任何帮助都会受到赞赏。
答案 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]);
这只是一个解决方案....你对它的看法。
干杯