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

ljsrvy3e  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(111)

我得到不同的结果与查询SQL和hql获取。我正在使用Spring repo和Hibernate,如下所示。但是,如果我运行由hibernate生成的相同SQL,我将获得ex 5记录,但我的列表customActivationPlans 1包含4记录。为什么Hibernate和HQL生成的同一SQL有区别?
我还注意到,当我的左连接为null时,会发生这种情况。join fetch c.latestRun r left join fetch r.runStatuses % s在DB中没有记录。

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

List 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);
ttp71kqs

ttp71kqs1#

我建议在你的日志配置中启用Hibernate 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://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/transaction-isolation-levels?view=sql-server-ver15
如果在持久化数据后立即查询数据,则可能还需要强制hibernate刷新会话:https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#flushing

jmp7cifd

jmp7cifd2#

我也遇到过类似的问题,Hibernate在构建正确的查询时,与SQL结果相比,缺少了一些结果。在我的例子中,问题是丢失的条目具有相同的id,而不是唯一的id。表没有任何约束,但实体确实有@Id女巫要求字段是唯一的。
修复ID解决了这个问题。
试着检查丢失的条目,也许你有类似的问题。

相关问题