【发布时间】:2012-01-15 14:50:38
【问题描述】:
我需要使用来自 HQL 的报告友好型查询。也就是说,每一列都由标准 Java 类型(Long、Integer、String、List)而不是映射类表示。这些值将被第三方库使用,因此我对后处理的控制非常有限。
我的示例对象树如下所示:
a.x
a.y (a collection of z)
a.y.z[0].v
a.y.z[1].v
a.y.z[2].v
我想查询以检索两列。第一列是普通的“a.x”字段,第二列是所有 a.y.z.v 值的逗号分隔列表的字符串。如果这是不可能的,那么让第二列作为 a.y.z.v 值的 Java 列表返回将是令人满意的。
简而言之,我想将 a.y.z.v 集合展平为 csv 字符串或查询内部的 List 对象。
我已经尝试了以下方法:
在列表子选择中使用“new”关键字。即,“选择 a.x,(从 a 中选择新列表(a.y.z.v))”。如有必要,我可以将列表的内容转换为 csv,但这会导致语法错误。
在子选择中对自定义对象使用“new”关键字。即,“选择 a.x, (select new custom.package.ListToCsvObject(a.y.z)) from a”。这导致与第一次尝试相同的错误
在选择中使用“elements()”关键字。不幸的是,这个关键字似乎只在“in”、“exists”子句(等)中起作用,而不是实际的返回值。
我们能够找到的唯一解决方案是在数据库中创建一个存储过程并使用它,但这样的解决方案通过 HQL 非常缓慢(它将亚秒查询变成 30 秒查询)并且因此,我们不想继续这样做。
我我能够对 Hibernate 映射进行一些有限的更改(因此我可以添加 @formula 等),但我希望不必对数据库架构进行重大更改以支持它. (所以不,我不想在数据库中创建一个非规范化的“csv_value”列!)
任何人都可以建议一些代码,或者,如果失败了,可以提供解决此问题的替代方法吗?
【问题讨论】: