Hibernate可以返回除List之外的结果对象的集合吗?

Hibernate API是否支持除List之外的集合forms的对象结果集?

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

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

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

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

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

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

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

来自Java Persistence with Hibernate :

  • 可以使用

    映射java.util.Map,保留键和值对。 使用java.util.HashMap初始化属性。

  • 可以使用

    元素映射java.util.SortedMap ,并且可以将sort属性设置为比较器或用于内存中排序的自然顺序。 使用java.util.TreeMap实例初始化集合。

是的,那可以做到。

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

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

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