【发布时间】:2014-11-20 23:54:43
【问题描述】:
我正在使用 Hibernate,我想执行这个查询:
SELECT s.executionTime, g.date, s.name
FROM SimulationStatsGroup g
LEFT JOIN SimulationStats s ON s.group_id = g.id
WHERE g.name = 'general'
ORDER BY g.date DESC
LIMIT 30
在此查询中,我必须对表和 1 个 SimulationStatsGroup 包含几个 SimulationStats。
但是,对于 HQL,LIMIT 会生成错误,因为 hibernate 不支持它。
所以我改用了setMaxResults(int),但是当我在日志中查找查询时,我发现根本没有LIMIT。
这可能是因为Hibernate知道SimulationStatsGroup可以包含多个SimulationStats,因此它知道限制为30个结果不会返回30个SimulationStatsGroup,而是30行,如果我们假设 1 个 SimulationStatsGroup 中有 10 个 SimulationStats,这将给我 3 个 SimulationStatsGroup。
所以,我可以理解为什么它会以这种方式工作,而不是我想要的方式。但是,这种执行查询的方式使我的应用程序崩溃,因为它使用了太多内存,因为我的表中有超过 100 万行,而且似乎 Hibernate 正在尝试将所有行放在一个列表。
我的问题是:有没有办法限制内存的使用以使我的应用程序保持活动状态并且只保留我的 30 个对象?
【问题讨论】:
-
请提供您的实际代码。
-
我猜 hibernate 可能会让你懒加载 SimulationStats。还请包括您如何将实体映射到表。我的意思是,我认为 hibernate 将首先执行查询,然后才会创建对象并用值填充它们(不确定,但这对我来说很有意义),所以你可能不得不告诉 hibernate 默认情况下不要加载你的统计信息.
-
默认情况下,Postgres 驱动程序将完整的结果缓冲在内存中。你可以通过 JDBC API 来改变它,但我不知道你是否可以通过 Hibernate 来改变它:jdbc.postgresql.org/documentation/93/query.html
标签: java hibernate postgresql jpa hql