【问题标题】:Can Hibernate return a collection of result objects OTHER than a List?Hibernate 可以返回结果对象的集合而不是列表吗?
【发布时间】:2009-01-06 15:30:49
【问题描述】:

Hibernate API 是否支持 List 以外的集合形式的对象结果集?

例如,我有一个运行数十万次迭代的流程,以便为客户创建一些数据。此过程使用值表(例如)中的记录,以便为每次迭代创建此输出。

对于列表,我必须遍历整个列表才能找到某个值,这很昂贵。我希望能够返回一个 TreeMap 并以编程方式指定一个键,这样我就可以在集合中搜索我需要的特定值。 Hibernate 可以为我做这件事吗?

【问题讨论】:

  • 您是否有理由不能在 where 子句中指定您的条件?
  • 我正在尝试将我想要使用的整组对象提取到内存中,这样我就可以减少对数据库的调用。如果我为每次迭代调用一个 SELECT,我会看到数十万个调用,这运行速度非常慢。
  • “这样我就可以减少对数据库的调用” - 它似乎不起作用,因为您有数十万个调用。您要么需要一些更智能的查询,要么需要更好的缓存解决方案。
  • 检查此问题的已接受答案:stackoverflow.com/a/118976/775523

标签: java hibernate


【解决方案1】:

我假设您指的是Query.list() 方法。如果是这样:不,除了List 之外,没有其他方法可以返回顶级结果。如果您收到太多结果,为什么不对数据库发出更受约束的查询呢?如果查询难以约束,可以用 Hibernate 的List 的内容填充自己的Map,然后丢弃列表。

【讨论】:

  • 谢谢,埃里克森。这就是我需要的答案。
【解决方案2】:

如果我理解正确,您可以将一堆数据从数据库加载到内存中,然后通过在该列表中查找某些对象来在本地使用它们。

如果是这种情况,我会看到 2 个选项。

  1. 不要加载所有数据,而是在每次迭代时使用仅返回您需要的特定记录的查询访问数据库。这将进行更多的数据库查询,因此它可能会更慢,但内存消耗要少得多。通过添加缓存可以轻松改进此解决方案,以便快速获取大多数使用的值。它当然需要一些性能测量,但我通常更喜欢具有良好缓存的简单解决方案,因为缓存可以实现为交叉关注点,并且对程序员非常透明。
  2. 如果您真的想将所有数据加载到内存中(这实际上是一种缓存形式),那么将数据从列表转换为 TreeMap(或任何其他有效结构)的时间可能会比全程处理。因此,您可以自己进行数据转换。

正如我所说,在一般情况下,我倾向于使用缓存的解决方案......

【讨论】:

  • 解决方案 1 正是我现在设置代码的方式。对数据库的查询数量正在将执行时间减慢到无法接受的水平(此代码针对美国的每个县运行...3141 次,可能需要数十万次迭代)。
  • 也许我的缓存解决方案设置不正确,因为即使我设置了缓存,我仍然看到正在使用 SQL Profiler(SQL Server 数据库)执行查询。
【解决方案3】:

来自Java Persistence with Hibernate

  • 可以使用 java.util.Map 进行映射 <map>,保留键和值 对。使用java.util.HashMap 初始化一个属性。
  • 可以映射一个java.util.SortedMap 使用 <map> 元素和排序 属性可以设置为 比较器或自然排序 内存排序。初始化 带有java.util.TreeMap 的集合 实例。

【讨论】:

  • 顺便说一句,您可以使用 List/SortedList、Set/SortedSet、Map/SortedMap、Collection/Bag 和 Primitive-array 对 Hibernate 中的对象进行分组。
【解决方案4】:

是的,可以这样做。

但是,您可能必须让您的域类实现Comparable;我不认为你可以使用比较器来做到这一点。

编辑: 好像我误解了这个问题。如果您正在谈论临时查询的结果,那么上述内容对您没有帮助。如果查询已修复,则可以通过将具有 TreeMap 属性的对象绑定到数据库视图来使其工作。

当然,您始终可以自己构建地图,只需很少的工作和处理开销。

【讨论】:

  • 有趣...这是否意味着我需要为代表我的表的对象编写一个包装类?例如,ValueMap 其中包含一个 Value 对象的映射?还是 Hibernate 有特定的方法而不是 list() 来返回结果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2018-03-16
  • 1970-01-01
相关资源
最近更新 更多