Hibernate在左连接上生成“on ...和null = null”

时间:2014-09-12 11:01:09

标签: hibernate postgresql jpa jpql

环境:

  • 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,但我得到了相同的结果。

2 个答案:

答案 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值Road代替nomenclature >

答案 1 :(得分:0)

经过多次证明,我发现问题与treat表达式的使用有关。

从JPA 2.1规范: 4.4.9向下转型

  

...

     

如果目标类型不是第一个参数的静态类型的子类型(正确或不正确),则查询无效。

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

我已经创建了一个Jira request