gpt4 book ai didi

Hibernate 在左连接上生成一个 "on ... and null=null"

转载 作者:行者123 更新时间:2023-11-29 13:30:08 25 4
gpt4 key购买 nike

环境:

  • hibernate-entitymanager:4.3.6.Final
  • PostgreSQL 9.3.5

我执行当前这个 JPQL 查询

select distinct entity
from Incidence entity
left join treat(entity.road as Road) as road
where entity.road is not null and lower(road.nomenclature) like :value

查看日志文件,这会为 PostgreSQL 生成此查询:

select
distinct
....
....
from public.incidence incidence0_
left outer join public.road road1_
on incidence0_.road=road1_.id and null=null
where (incidence0_.road is not null) and (lower(road1_.nomenclature) like ? )

使用 %cv% 作为参数,这个查询应该返回 175 行,但我没有得到。

如果我在 PostgreSQL 上运行注释 and null=null 的查询,我会得到预期的结果:

select
distinct
....
....
from public.incidence incidence0_
left outer join public.road road1_
on incidence0_.road=road1_.id /* and null=null */
where (incidence0_.road is not null) and (lower(road1_.nomenclature) like '%cv%' )

那么...为什么 hibernate 将“null=null”条件添加到左连接?

我已经用 Oracle 试过了,我得到了完全相同的结果。

最佳答案

经过多次证明,我发现问题出在treat表达式的使用上。

来自 JPA 2.1 规范:4.4.9 向下转型:

...

If the target type is not a subtype (proper or improper) of the static type of the first argument, the query is invalid.

在我的模型中,Road 是一个没有 super 类且没有子类型的实体类,因此,据我所知,我的 JPQL 应该抛出异常或(因为是同一类型) 忽略treat 表达式

我创建了一个 Jira request关于它。

关于Hibernate 在左连接上生成一个 "on ... and null=null",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25806807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com