环境:
我执行当前的这个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,但我得到了相同的结果。
答案 0 :(得分:0)
而不是使用entity.road is not null
尝试直接使用您的别名road
select distinct entity
from Incidence entity
left join treat(entity.road as Road) as road
where road is not null and lower(road.nomenclature) like :value
因为当你使用entity.road时,Hibernate尝试添加一个隐式连接,在你的情况下,它可能会在你的左连接和它自己的隐式连接之间混淆。
另外,如果您只希望join
left join
具有特定Incidence
值
nomenclature
>
答案 1 :(得分:0)
经过多次证明,我发现问题与treat
表达式的使用有关。
从JPA 2.1规范: 4.4.9向下转型:
...
如果目标类型不是第一个参数的静态类型的子类型(正确或不正确),则查询无效。
在我的模型中, Road 是一个没有supper类的实体类,并且没有子类型,因此,据我所知,我的JPQL 应该抛出异常或(因为它是相同的类型) )忽略处理表达式
我已经创建了一个Jira request。