0

我有以下类(为清楚起见进行了简化):

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 子句的选择列表中放置什么。

无论我在逗号后面放什么,在 Object(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 实现是休眠 3.6.4.Final。TIA 为您提供帮助。

4

2 回答 2

0

ORDER BY 子句中使用的字段必须是 CMP 字段,不能是实体标识符或 CMR 字段。此外,您必须注意您在 ORDER BY 子句中指定的 CMP 字段。如果查询选择实体集合,则 ORDER BY 子句只能与所选实体类型的 CMP 字段一起使用。例如以下查询是非法的,因为 ORDER BY 子句中使用的 CMP 字段不是所选实体类型的字段。

按 c.address.city 的 c 订单从客户中选择对象(c)

因为 city CMP 字段不是 Customer EJB 的直接 CMP 字段,所以不能在 ORDER BY 子句中使用它。您可以在 ORDER BY 子句中使用的唯一 CMP 字段是所选实体类型的直接 CMP 字段。这是一个不合理的限制。

类似的限制适用于 CMP 结果。ORDER BY 子句中使用的 CMP 字段必须与 SELECT 子句中标识的 CMP 字段相同。例如,以下查询是非法的,因为 SELECT 子句中标识的 CMP 与 ORDER BY 子句中使用的不同。

从客户中选择 c.address.city 作为 c ORDER BY c.address.state

在上面的查询中,我们想要一个按州排序的所有城市的列表。不幸的是,这是非法的。如果您选择使用城市 CMP 字段,则不能按州 CMP 字段进行排序。

我听说第二个限制可能是由于主要 RDBS 系统之一的限制而强加给我们的,该系统无法按 select 子句中不存在的任何列进行排序 - 请记住 EJB QL 被编译成本机查询语言,在 RDBS 中是 SQL。主要供应商的限制将是创建任何抽象的一个因素——最小公分母将占上风。

于 2013-03-06T05:52:28.630 回答
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.name.localizedString.value 属性排序的 Top 实例。

现在,如果有人能解释为什么 DISTINCT 不起作用,那就太好了。谢谢。

于 2013-03-06T22:47:30.167 回答