在子对象的 属性 上排序
Ordering on property of child object
运行 Grails 2.3.9,查询有问题。假设我有 2 个域对象:
class Box {
String name
}
和
class Skittle {
String name
Box box
}
吃喝玩乐在盒子里,但盒子没有提及吃喝玩乐。有很多吃喝玩乐,每个有吃喝玩乐的盒子可能有数百个吃喝玩乐。而且还有几千个箱子。
我想要一个不同的列表,其中包含按 box.name
排序的所有盒子。
我不在乎我是使用 Hibernate 还是 criteria,但两者都不适合我。当我尝试标准和预测时,我有类似的东西:
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
table.
的 2 个副本
(我尝试使用别名 s.box as b
并在 b.name
上进行排序,希望这样可以欺骗它只进行一次连接,但结果崩溃得很厉害)
您可以为此使用以下查询
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
/$)
运行 Grails 2.3.9,查询有问题。假设我有 2 个域对象:
class Box {
String name
}
和
class Skittle {
String name
Box box
}
吃喝玩乐在盒子里,但盒子没有提及吃喝玩乐。有很多吃喝玩乐,每个有吃喝玩乐的盒子可能有数百个吃喝玩乐。而且还有几千个箱子。
我想要一个不同的列表,其中包含按 box.name
排序的所有盒子。
我不在乎我是使用 Hibernate 还是 criteria,但两者都不适合我。当我尝试标准和预测时,我有类似的东西:
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
table.
(我尝试使用别名 s.box as b
并在 b.name
上进行排序,希望这样可以欺骗它只进行一次连接,但结果崩溃得很厉害)
您可以为此使用以下查询
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
/$)