這個問題是不大不小的後續我這裏貼的問題:Problem with duplicates using Grails' withCriteria function with a many-to-many relationship試圖讓Hibernate的產生,而不是內部連接(使用Grails)子查詢
我使用的是相同的3個域類中定義還有,添加以下類的:
class Genre {
int id
String name
}
及有關問題的類增加genre屬性:
class Question {
int id
int text
Genre genre
static hasMany = [questionAnswers : QuestionAnswer]
}
我已經試過2個查詢:
def criteria = Answer.createCriteria()
def listing = criteria.listDistinct() {
cache false
order "id", "asc"
maxResults(10)
questionAnswers {
question {
genre {
eq("id", myGenreID)
}
}
}
}
和
def criteria2 = Answer.createCriteria()
def listing2 = criteria2.listDistinct() {
join "questionAnswers"
join "questionAnswers.question"
join "questionAnswers.question.genre"
createAlias "questionAnswers", "qa"
createAlias "qa.question", "q"
createAlias "q.genre", "g"
cache false
order "id", "asc"
maxResults(10)
eq("g.id", myGenreID)
}
兩個查詢基本上產生相同的SQL,除了第一生成左外聯接和第二生成內部聯接。這裏是第二個查詢的輸出(以簡化的「SELECT *」):
select *
from answer a
inner join question_answer qa on a.id = qa.answer_id
inner join question q on qa.question_id = q.id
inner join genre g on q.genre_id = g.id
where g.id = 1
order by a.id asc
limit 10;
上面的SQL必須返回重複回答行,這是我不希望的潛力,所以我用了listDistinct功能上CriteriaQuery中(我在所引用的問題上接受的resultTransformer解決方案的替代方案)。
問題出在這裏:maxResults函數應用在listDistinct函數之前,所以如果有任何重複的答案行,我總是會得到少於10個結果。
我真的需要生成的SQL看起來更像是這樣的:
select *
from answer a
where a.id in (select distinct qa.answer_id
from question_answer qa
inner join question q on qa.question_id = q.id
inner join genre g on q.genre_id = g.id
where g.id = 1)
order by a.id asc
limit 10;
有沒有辦法在上面的SQL打開question_answer查找到一個子查詢什麼樣的?
(我的道歉,如果該解決方案是非常簡單的。如果它不是來自我的問題非常明顯,我不是在休眠非常驚人的。)
任何幫助/建議大加讚賞。
感謝,
B.J.
使用listDistinct函數,您可以在不同的表上指定FetchMode,如在Hibernated中。我嘗試將FetchMode.SELECT放在questionAnswers表上,但它仍然像以前一樣生成相同的SQL。 – Benny