java - 如何使用 View 和过滤器避免 hibernate 中的嵌套查询

标签 java sql hibernate filter views

我将 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 毫秒)。那么,有没有人知道避免这种情况的方法?

最佳答案

我可以在这里看到各种问题和解决方案:

  1. 看看您是否可以完全避免@Subselect 注释 => 如果您可以在数据库中创建一个 View 返回所请求的数据,它将使整个场景和影响(hibernate 映射)更容易(为什么 Hibernate 应该做或优化一些数据库真正优化和设计的东西)
  2. Hibernate 不会生成明显针对您的数据库(版本)优化的代码 => 尝试切换到较新的 Hibernate 版本或使用特定于数据库的提示/配置(方言、供应商等)影响它.)
  3. 数据库在优化您的查询方面做得不好(过滤器下推)并且似乎在这种常见的优化策略方面表现很差 => 尝试切换到较新的数据库版本或切换 DBMS 如果可能(例如 PostgreSQL、Oracle 等),因为预计 future 会出现更多问题

(对于更具体的细节,确实需要了解更多关于您的表、数据库版本和注释类的背景信息)

关于java - 如何使用 View 和过滤器避免 hibernate 中的嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31966586/

相关文章:

java - 我可以在 Java 中的 lambda 表达式中放置 if 语句吗?

sql - 由1.99.10和1.99.9 sql server订购

java - java swing 中的 Hibernate 和库 sql cp30

sql - 关于数据库设计的疑问

java - 由于重复的 GUID,无法将数据库状态与 session org.hibernate.exception.ConstraintViolationException 同步

mysql - 如何使用 MySQL 获取有序表中行的位置?

java - 删除时 CASCADE 在 hibernate 中的多对多映射中不起作用

java - Java swing 中单击的 JButton 的返回索引

java - 一个 JMS 主题中可以排队多少条消息?

php - mySQL select query,通过一些逻辑从多个表中获取数据