2015-04-14 56 views
0

運行Grails 2.3.9並且遇到查詢問題。說我有2個域對象:在子對象的屬性上訂購

class Box { 
    String name 
} 

class Skittle { 
    String name 
    Box box 
} 

吃喝玩樂都在盒子裏,但盒子不必長短的參考。有很多吃喝玩樂,每個有吃喝玩樂的盒子可能有數以百計的吃喝玩樂。還有數千個盒子。

我想要一個不同的列表中所有具有skittles按box.name排序的框。

我不在乎我是否使用Hibernate或標準,但都不適合我。當我嘗試標準和預測,我有這樣的事情:

def c = Skittle.createCriteria() 
List results = c.list { 
    projections { 
    distinct "box" 
    } 
    box { 
    order "name" 
    } 
} 

有趣的是,這個工作對一個MySQL數據庫,但甲骨文沒有工作。我的第二次嘗試與HQL:

List results = Skittle.executeQuery("SELECT DISTINCT s.box FROM Skittle s ORDER BY s.box.name") 

這也是MySQL的工作,但再次失敗甲骨文(此時有討厭的錯誤代碼ORA-01791: not a SELECTed expression

檢查Hibernate日誌,我發現它的使用創造了條件2加入到Box

select distinct 
box1_.id as id22_, 
box1_.version as version22_, 
box1_.name as name22_ 
from skittle skittle0_ inner join box box1_ on skittle0_.box_id=box1_.id, box box2_ 
where skittle0_.box_id=box2_.id 
order by box2_.name 

現在的錯誤是有道理的,當我沒有選擇它,我不能box2._name訂單,但根據我的Hibernate查詢,我不應該參加的2份。 box表。

(我試過b.name走樣s.box as b和訂貨希望將誘騙到只有做一個連接,但壯觀的崩潰)

回答

1

您可以使用下面的查詢該

def boxes = Box.executeQuery($/ 
     SELECT b 
     FROM Box b 
     WHERE EXISTS(
      SELECT 1 
      FROM Skittle s 
      WHERE s.box = b 
     ) 
     ORDER BY b.name ASC 
/$) 
+0

簡單,快捷和工作。榮譽。 – Trebla