2011-08-25 41 views
0

這個問題是不大不小的後續我這裏貼的問題: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.

回答

0

我不知道Grails的,但在休眠我認爲你在尋找什麼的fetching strategies轄下的瀑布。例如,設置此的一種方法是使用@OneToMany.fetch屬性。您還可以設置在查詢一個抓取策略如本例所示從參考指南是same chapter

User user = (User) session.createCriteria(User.class) 
    .setFetchMode("permissions", FetchMode.JOIN) 
    .add(Restrictions.idEq(userId)) 
    .uniqueResult(); 

我希望幫助你指出正確的方向。

+0

使用listDistinct函數,您可以在不同的表上指定FetchMode,如在Hibernated中。我嘗試將FetchMode.SELECT放在questionAnswers表上,但它仍然像以前一樣生成相同的SQL。 – Benny

相關問題