プラットフォームを学ぶために、GrailsでおもちゃのQ&Aサイトを作成しています。私には投稿とタグの2つのドメインがあり、それらの間には多対多の関係があります。タグ付きの投稿のリストを印刷したい。
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>
とにかく、質問ごとにクエリが実行されます!ここで推奨されるアプローチは何ですか?