我有以下课程(为简洁起见而简化):
Class Top {
InternationalStringType name;
}
Class InternationalStringType {
List<LocalizedStringType> localizedString;
}
Class LocalizedStringType {
String value;
}
以下EJBQL查询成功检索了Top的所有实例,并填充了其子对象:
SELECT DISTINCT Object(t) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls
我想修改上面的查询,使得结果按Top.name.localizedString.value排序
执行此操作的正确语法是什么?我尝试了以下查询,但我得到“错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中”
SELECT DISTINCT Object(t) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC
我不清楚在ORDER BY子句的选择列表中放入什么。
在对象(t)后面的“,”之后给出错误,无论我在逗号之后放了什么:
SELECT DISTINCT Object(t), Object(nm_ls) FROM Top t LEFT OUTER JOIN t.name nm LEFT OUTER JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC
如果它的相关我的JPA实现是hibernate 3.6.4.Final。 TIA求助。
答案 0 :(得分:0)
ORDER BY子句中使用的字段必须是CMP字段,它们不能是实体标识符或CMR字段。此外,您必须小心在ORDER BY子句中指定的CMP字段。如果查询选择实体集合,则ORDER BY子句只能用于所选实体类型的CMP字段。例如,以下查询是非法的,因为ORDER BY子句中使用的CMP字段不是所选实体类型的字段。
SELECT OBJECT(c) 来自客户AS c ORDER BY c.address.city
因为city CMP字段不是Customer EJB的直接CMP字段,所以不能在ORDER BY子句中使用它。您可以在ORDER BY子句中使用的唯一CMP字段是那些是所选实体类型的直接CMP字段的字段。这是一个不合理的限制。
类似的限制适用于CMP结果。 ORDER BY子句中使用的CMP字段必须与SELECT子句中标识的CMP字段相同。例如,以下查询是非法的,因为SELECT子句中标识的CMP与ORDER BY子句中使用的CMP不同。
SELECT c.address.city 来自客户AS c ORDER BY c.address.state
在上面的查询中,我们想要一个按州排序的所有城市的列表。不幸的是,这是非法的。如果使用城市CMP字段选择,则无法通过状态CMP字段进行排序。
我听说第二个限制可能是由于某个主要RDBS系统的限制而强加给我们的,这些系统不能通过select子句中没有的任何列排序 - 记住EJB QL被编译成本机查询语言,在RDBS中是SQL。主要供应商的局限性将是创造任何抽象的一个因素 - 最小的共同点将占上风。
答案 1 :(得分:0)
通过简单地删除SELECT子句中的DISTINCT限定符,我能够使ORDER BY子句与我的查询一起工作。我不确定我是否了解这些优点,但以下修改后的查询完美无缺!
SELECT t FROM Top t LEFT JOIN t.name nm LEFT JOIN nm.localizedString nm_ls ORDER BY nm_ls.value ASC
我现在得到一个结果集,Top实例按照我希望的Top.name.localizedString.value属性排序。
现在,如果任何人都可以解释为什么DISTINCT不起作用那会很棒。感谢。