【问题标题】:hibernate property formula how to get more than 1 row?hibernate属性公式如何获得超过1行?
【发布时间】:2009-10-28 11:38:06
【问题描述】:

在休眠映射文件中,我使用属性公式来获取任何值。

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

但它只允许获取 1 行。我怎样才能得到行的 lisf? 我了解“属性”不合适,但无法将公式添加到集合或列表中。

当然,我只想在不添加新类的情况下获取值。 我只有 sql 请求,并希望获取现有类的列表或设置。

【问题讨论】:

  • 听起来你真的想要一个 1:m 参考,没有一个“正确的”参考字段。这是正确的吗?
  • 好吧,我需要在我的班级中添加一个列表。它将仅用于显示有关此对象的任何附加信息。而且这个表没有被映射文件覆盖,因为它们被另一个应用程序使用。

标签: hibernate properties formula


【解决方案1】:

如果您的公式返回多行,则需要将语句与实体标识符链接起来,例如:

选择列名
来自 其中 table.identifier = entity_identifier

关于将此应用于一组值,也许可以按功能分组。例如,我曾经使用 mysql 中的 group_concat 来显示值列表。不好的地方是这个公式和mysql原生方言耦合了,但是它起作用了。

【讨论】:

  • 很高兴了解 group_concat 函数。感谢您发布建议。
【解决方案2】:

公式属性只对当前行起作用。如果要执行聚合函数,则需要编写特定的查询来获取它们。请参阅section of the hibernate docs that handle aggregate functions

【讨论】:

  • 是的,我可以编写一个返回更多 tnen 1 行的查询,但是如何将这个结果存储在我的班级中?我想在与我的班级相关的映射 xml 文件中设置此查询。
  • 你不能,这就是我要说的。您不能拥有包含多行数据的行的属性,这是没有意义的。
  • 我并不是说我想要完全的财产。让它成为列表或集合或其他东西,没关系,但是如何?
  • 链接已过时。现在可能是here
【解决方案3】:

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

这里的棘手部分是,从您的问题看来,您想要的是一组元素(doubleprice)而不是实体;我从未尝试指定自定义加载程序 对于这样的事情,所以不确定它是否会起作用。文档在这个问题上相当沉默。

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

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

【讨论】:

  • 死链接...代码示例会更有用
  • 是的,死链接很烂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多