我正在使用 Grails 创建一个玩具问答网站,以学习该平台。我有两个域,帖子和标签,它们之间有多对多的关系。我想打印带有标签的帖子列表。
我不能使用延迟获取,因为我会遇到 N+1 选择问题
我也不能使用急切获取,因为它使用左连接,我无法正确分页结果。
因此,我决定使用以下代码手动获取标签:
static def getList(params) {
ArrayList questions = Question.list(params)
def questionMap = [:]
questions.each {
questionMap.put(it.id, it)
}
if(questions.size()>0) {
Tag.executeQuery('SELECT q.id, t FROM Tag t JOIN t.questions q \
WHERE q.id in ( :list ) ', [ list:questions.collect{ it.id } ] ).each { questionMap.get(it[0]).tags.add(it[1]) }
}
return questions
}
但是,当我在视图中打印标签时:
<g:each in="${questions}" var="question">
${question.title}
<g:each in="${question.tags}" var="tag">
${tag?.text}
</g:each>
</g:each>
无论如何都会为每个问题执行一个查询!这里推荐的方法是什么?