【问题标题】:Ordering on property of child object对子对象的属性进行排序
【发布时间】:2015-06-20 12:59:58
【问题描述】:

运行 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 表的 2 个副本。

(我尝试使用别名 s.box as b 并在 b.name 上进行排序,希望这会欺骗它只进行一次连接,但结果崩溃了)

【问题讨论】:

    标签: oracle hibernate grails


    【解决方案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
    /$)
    

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2013-02-12
      相关资源
      最近更新 更多