2009-01-06 57 views
3

Hibernate API是否支持List之外的集合形式的对象结果集?Hibernate能否返回一个比List更为结果对象的集合?

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

随着列表我将不得不遍历整个列表,以找到一个特定的价值,这是昂贵的。我希望能够返回一个TreeMap并以编程方式指定一个键,以便我可以在集合中搜索我需要的特定值。 Hibernate可以为我做这个吗?

+0

是否有理由不能在where子句中指定您的条件? – 2009-01-06 15:35:31

+0

我试图将我想要使用的整个对象集合到内存中,这样我就可以减少对数据库的调用。如果我为每次迭代调用一个SELECT,我正在查看成千上万的调用,运行速度非常慢。 – karlgrz 2009-01-06 15:40:47

+0

“所以我可以减少对数据库的调用” - 它似乎没有工作,因为你有成千上万的电话。您可能需要更聪明的查询或更好的缓存解决方案。 – duffymo 2009-01-07 11:08:45

回答

2

我想你指的是Query.list()方法。如果是这样:否,除了List以外,没有办法返回顶级结果。如果您收到的结果太多,为什么不向数据库发出更受限制的查询?如果查询难以限制,您可以使用Hibernate的List的内容填充自己的Map,然后丢弃列表。

1

Java Persistence with Hibernate

  • 甲java.util.Map可以与 <map>,保存键和值 对被映射。使用java.util.HashMap至 初始化一个属性。
  • java.util.SortedMap可以映射 与<map>元件,以及排序 属性可以被设置到任何一个 比较器或自然顺序为在内存中 排序。使用java.util.TreeMap 实例初始化 集合。
+0

就像旁边一样,您可以使用List/SortedList,Set/SortedSet,Map/SortedMap,Collection/Bag和primitive-array用Hibernate分组对象。 – Elie 2009-01-06 15:37:46

1

是的,可以做到。

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

编辑: 这似乎是我误解了这个问题。如果您正在讨论特设查询的结果,那么上述内容将无助于您。如果查询是固定的,则可以通过将具有TreeMap属性的对象绑定到数据库视图来使其工作。

当然,您可以随时自行构建地图,而且工作量和处理开销都很小。

2

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

如果是这样,我会看到2个选项。

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

正如我所说的,在一般情况下,我赞成用高速缓存的解决方案...

相关问题