Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate中从数据库获取不同的结果_Java_Hibernate_Spring Data Jpa - Fatal编程技术网

Java 在hibernate中从数据库获取不同的结果

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

我使用查询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在数据库中没有记录

@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