我将 hibernate 与 View (注解@Subselect 和@Synchronize)和过滤器一起使用。问题是 hibernate 封装了查询(由 @Subselect 注释的 'value' 属性定义)并且性能变得非常慢。
例如,如果我编写自己的 SQL 查询(执行时间不超过 100 毫秒),就像这样:
SELECT id,
country_id,
firstName,
lastName
FROM client
WHERE client.country_id IN (2564,2558,1452,3652)
但是如果我使用带过滤器的 hibernate ,生成的查询将是:
SELECT _this.id AS id1_0_0,
_this.country_id AS country_id2_0_0
_this.firstName AS firstName3_0_0,
_this.lastName AS lastName4_0_0
FROM (
SELECT id,
country_id,
firstName,
lastName
FROM client
) _this
WHERE _this.country_id2_0_0 IN (2564,2558,1452,3652)
这意味着 hibernate 生成的 SQL 比我手写的 sql 查询慢,因为 'client' 表(在嵌套查询中)的所有行都被加载,并且在加载所有行后在父查询中执行过滤操作,这是愚蠢的并且提供非常慢的性能(1.7 秒对小于 100 毫秒)。那么,有没有人知道避免这种情况的方法?
最佳答案
我可以在这里看到各种问题和解决方案:
- 看看您是否可以完全避免@Subselect 注释 => 如果您可以在数据库中创建一个 View 返回所请求的数据,它将使整个场景和影响(hibernate 映射)更容易(为什么 Hibernate 应该做或优化一些数据库真正优化和设计的东西)
- Hibernate 不会生成明显针对您的数据库(版本)优化的代码 => 尝试切换到较新的 Hibernate 版本或使用特定于数据库的提示/配置(方言、供应商等)影响它.)
- 数据库在优化您的查询方面做得不好(过滤器下推)并且似乎在这种常见的优化策略方面表现很差 => 尝试切换到较新的数据库版本或切换 DBMS 如果可能(例如 PostgreSQL、Oracle 等),因为预计 future 会出现更多问题
(对于更具体的细节,确实需要了解更多关于您的表、数据库版本和注释类的背景信息)
关于java - 如何使用 View 和过滤器避免 hibernate 中的嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31966586/