【问题标题】:Different results fetching from DB in hibernate在休眠中从数据库中获取不同的结果
【发布时间】:2020-02-10 15:27:45
【问题描述】:

使用查询 SQL 与 hql 获取不同的结果。 我正在使用 Spring 回购和休眠,如下所示。但是,如果我运行由休眠生成的相同 SQL,我将获得前 5 条记录,但我的列表 customActivationPlans1 包含 4 条记录。 为什么hibernate和HQL生成相同的SQL会有差异。

我还注意到当我的左连接为空时会发生这种情况。 join fetch c.latestRun r left join fetch r.runStatuses s 数据库中没有记录。

@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private PlanRun latestRun;

列出 customActivationPlans1 = customPlanRepository.findAllDataSetSelnsAndStatusByTenantId(RequestUtil.getSessionTenant(), dataSourceType);

@Query("select DISTINCT c from CustomActivationPlan c join fetch c.dataSetSelections s left join fetch c.latestRun r left join fetch r.runStatuses s "
        + "where c.tenantId =:tenantId and s.tenantId =:tenantId and c.dataSourceType = :dataSourceType")
public List<CustomActivationPlan> findAllDataSetSelnsAndStatusByTenantId(@Param("tenantId") String tenantId, DataSourceType dataSourceType);

【问题讨论】:

    标签: java hibernate spring-data-jpa


    【解决方案1】:

    我建议在您的日志记录配置中启用休眠 SQL 输出:

    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
    

    https://www.baeldung.com/sql-logging-spring-boot

    这样就可以对比生成的SQL,看看有没有逻辑上的差异。

    如果没有逻辑上的差异,最可能的解释是hibernate正在缓存结果。这可能发生在会话级别,也可能发生在二级缓存中: https://www.javacodegeeks.com/2012/02/hibernate-cache-levels-tutorial.html

    事务隔离也可能是一个因素。事务隔离控制数据库如何根据其他事务中所做的更改显示 SQL 结果: https://docs.microsoft.com/en-us/sql/odbc/reference/develop-app/transaction-isolation-levels?view=sql-server-ver15

    如果您在持久化数据后立即查询数据,您可能还需要强制休眠以刷新会话: https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#flushing

    【讨论】:

    • 感谢您的回复。SQL 没有区别,因为休眠生成的 SQL 仅在 MySQL 控制台中运行,并且未在我的应用程序中使用任何缓存,它仅跳过我的左连接条件为空的那些记录。
    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2021-10-14
    • 2011-07-05
    • 2015-11-09
    • 2016-07-24
    • 2012-08-14
    相关资源
    最近更新 更多