Java 在hibernate中从数据库获取不同的结果
我使用查询SQL和hql获取不同的结果。 我使用SpringRepo和hibernate,如下所示。但是,如果我运行hibernate生成的相同SQL,那么我将获得ex 5记录,但我的列表customActivationPlans1包含4条记录。 为什么hibernate和HQL生成的同一个SQL存在差异 我还注意到当我的左连接为null时会发生这种情况。 join fetch c.latestRun r left join fetch r.RunStatus s在数据库中没有记录Java 在hibernate中从数据库获取不同的结果,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我使用查询SQL和hql获取不同的结果。 我使用SpringRepo和hibernate,如下所示。但是,如果我运行hibernate生成的相同SQL,那么我将获得ex 5记录,但我的列表customActivationPlans1包含4条记录。 为什么hibernate和HQL生成的同一个SQL存在差异 我还注意到当我的左连接为null时会发生这种情况。 join fetch c.latestRun r left join fetch r.RunStatus s在数据库中没有记录 @ManyT
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private PlanRun latestRun;
List customActivationPlans1=customPlanRepository.findAllDataSetSelnsAndStatusByTenantId(RequestUtil.getSessionTenant(),dataSourceType)
@Query(“从CustomActivationPlan c连接获取c.dataSetSelections左连接获取c.latestRun r左连接获取r.RunStatus s中选择不同的c”
+“其中c.tenantId=:tenantId和s.tenantId=:tenantId和c.dataSourceType=:dataSourceType”)
公共列表findAllDataSetSelnsAndStatusByTenantId(@Param(“tenantId”)字符串tenantId,DataSourceType DataSourceType);
我建议在日志配置中启用hibernate SQL输出:
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
通过这种方式,您可以比较生成的SQL并查看是否存在任何逻辑差异
如果没有逻辑差异,最可能的解释是hibernate正在缓存结果。这可以发生在会话级别,也可以发生在第二级缓存中:
事务隔离也可能是一个因素。事务隔离控制数据库根据在其他事务中所做的更改显示SQL结果的方式:
如果在持久化数据后立即查询数据,可能还需要强制hibernate刷新会话:
感谢您的回复。SQL没有任何区别,因为hibernate生成的SQL只在MySQL控制台中运行,我没有在应用程序中使用任何缓存,它只跳过我的左连接条件为空的记录。
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE