我正在从Sping Boot 3.1.0迁移到3.1.1,只是一个简单的补丁版本升级。
但是Hibernate(版本6.2.5包含在其中,这是目前最新的版本)错误地在表上使用JOIN而不是定义的LEFT JOIN。这意味着我得到的结果更少,因为外键是可选的。
回购:
@Query("""
SELECT ak FROM ApiKey ak
LEFT JOIN ak.role r
WHERE ak.projectId = :projectId
""")
Page<ApiKey> find(@Param("projectId") UUID projectId, Pageable pageable);
我们在role
上留下JOIN的原因是因为pageable可以包含role.name
上的排序
但是,Hibernate现在生成查询:
select a1_0.id,a1_0.created_date,a1_0.db_version,a1_0.expiry_date,a1_0.last_used,a1_0.name,a1_0.project_id,a1_0.public_part,a1_0.role_id,a1_0.secret_key_hash,a1_0.updated_date from api_key a1_0 join role r2_0 on r2_0.id=a1_0.role_id where a1_0.project_id=? order by r2_0.name offset ? rows fetch first ? rows only
它有一个规则的连接,这显然是错误的。除了重写SQL,我还能做什么?
1条答案
按热度按时间jgovgodb1#
如果Role表是seprate表,那么你应该尝试这样做。
如果你想在同一个表上应用leftjoin,那么试试这个