EJBQL - 如何通过LEFT JOIN中的字段对查询结果进行排序

时间:2013-03-05 17:53:46

标签: ejbql

我有以下课程(为简洁起见而简化):

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求助。

2 个答案:

答案 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不起作用那会很棒。感谢。

相关问题