订购子对象的属性

时间:2015-04-14 19:06:09

标签: oracle hibernate grails

运行Grails 2.3.9并遇到查询问题。假设我有2个域对象:

class Box {
  String name
}

class Skittle {
  String name
  Box box
}
吃喝彩虹在盒子里,但盒子没有提到吃喝玩乐。有很多吃喝玩乐,每个有撞柱的盒子可能有数百个吃喝玩乐。有成千上万的盒子。

我想要一个包含按box.name排序的跳伞的所有方框的明确列表。

我不在乎我是否使用Hibernate或标准,但两者都不适合我。当我尝试标准和预测时,我有类似的东西:

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

有趣的是,这对MySQL数据库有效,但对Oracle无效。我的第二次尝试是使用HQL:

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

这在MySQL中也有效,但在Oracle中再次失败(这次有一个讨厌的错误代码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查询,我不应该加入box表的两个副本。

(我尝试对s.box as b进行别名并在b.name上进行排序,希望这会欺骗它只进行一次连接,但这种情况非常糟糕)

1 个答案:

答案 0 :(得分: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
/$)