2009-10-28 27 views
1

在hibernate映射文件中,我使用属性公式来获取任何值。hibernate属性公式如何获得多于1行?

<property name="price" type="double" formula="(select SUM(amount) ...) /> 

但它只允许获得1行。我如何获得行的lisf? 我知道“财产”不适合,但不可能添加公式来设置或列出。

当然,我只想在不添加新类的情况下获取值。 我只是有SQL请求,并期望获得列表或设置为存在的类。

+0

听起来像你真的想有1:m的引用,没有一个'正确的'参考字段。 这是正确的吗? – 2009-10-28 11:45:36

+0

好吧,我需要给我的班级添加一个列表。它将仅用于显示有关此对象的任何其他信息。而这个表格没有覆盖映射文件,因为它们被另一个应用程序使用。 – 2009-10-28 12:17:55

回答

1

公式属性仅对当前行进行操作。如果你想执行集合函数,你需要编写一个特定的查询来获取它们。请参阅section of the hibernate docs that handle aggregate functions

+0

是的,我可以写一个查询返回更多的1行,但我怎么能将这个结果存储在我的课堂? 而我想在我的类的映射xml文件中设置此查询。 – 2009-10-28 11:47:27

+0

你不能,那就是我所说的。您不能拥有包含多行数据的行的属性,这是没有意义的。 – skaffman 2009-10-28 12:08:29

+1

我并不是说我想要的是属性。让它成为列表或设置或别的东西,无所谓,但如何? – 2009-10-28 12:22:54

0

公式仅适用于单值属性;而不是集合。但是,您可以指定custom SQL statement to be used for loading a collection

这里棘手的部分是,从你的问题,它听起来像你想要的是一组元素(价格double),而不是实体;我从来没有试图指定自定义加载器 这样的事情,所以我不知道它是否会工作。文档在这个问题上相当沉默。

如果上述不起作用,另一种选择是将您的SELECT定义为视图和地图集合(再次,作为元素的集合)。

最后,您还可以运行建议如skaffman的查询。您需要调用该查询并在适当的时候手动在您的实体上填充集合(例如,在实体加载后您的DAO中)ro可以define an appropriate listener并在那里执行。

+0

死链接...代码示例会更有用 – Gus 2016-11-06 23:32:50

+0

是的,死链接非常蹩脚。 – Casey 2017-02-22 13:24:50

1

如果你的公式返回多行,你需要的声明与实体标识符链接,例如:

选择列名
其中 .identifier = entity_identifier

关于将此应用于一组值,可能是按功能分组。我曾经使用过mysql的group_concat来显示值的列表。坏事情是这个公式与mysql本地方言相结合,但它工作。

+0

很高兴有关于group_concat功能的知识。感谢您发布该建议。 – 2012-09-03 06:47:15