java 从Sping Boot 3.1.0迁移到3.1.1时,Hibernate会中断JOIN查询

zzlelutf  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(119)

我正在从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,我还能做什么?

jgovgodb

jgovgodb1#

如果Role表是seprate表,那么你应该尝试这样做。

SELECT 
    ak
FROM
    ApiKey ak
        LEFT JOIN
    Role r ON ak.role = r.id
WHERE
    ak.id = 1;

如果你想在同一个表上应用leftjoin,那么试试这个

SELECT 
    ak
FROM
    ApiKey ak
        LEFT JOIN
    ApiKey ak1 ON ak.role = ak1.role
WHERE
    ak.id = :projectId;

相关问题