使用左连接搜索实体的 JPQL 查询

JPQL query with left join searching for entity

基于以下文章 JPQL, OR only returning result of one condition? 我创建了以下查询

Collection<Profile> profiles = dataManager.load(Profile.class).view("profile-view")
        .query("select p from userlifecyclemgmt_Profile p " +
                " left join p.legalEntities f where" + 
                " p.isAvailableForAll = true or :legalEntity MEMBER OF f" ) 
        .parameter("legalEntity", serviceRequest.getHrUser().getLegalEntity())
        .list();

参数:legalEntity是classLegalEntity的对象。此查询给我以下错误:

JpqlSyntaxException: Errors found for input jpql:[select p from userlifecyclemgmt_Profile p  left join p.legalEntities f where p.isAvailableForAll = true or :legalEntity MEMBER OF f]
CommonErrorNode [<unexpected: [@35,120:125='MEMBER',<113>,1:120], resync=:legalEntity MEMBER OF f>]

使用相同的查询稍作修改:

Collection<Profile> profiles = dataManager.load(Profile.class).view("profile-view")
        .query("select p from userlifecyclemgmt_Profile p " +
                " left join p.legalEntities f where" +
                " p.isAvailableForAll = true or :legalEntity MEMBER OF p.legalEntities" )
        .parameter("legalEntity", serviceRequest.getHrUser().getLegalEntity())
        .list();

没有错误,但只给出了 OR 语句第二部分的结果。我知道 JPQL 在后台创建了一个 INNER JOIN 查询,这就是原因。但是,如何让第一个查询起作用?

提前致谢!

你应该这样修改查询

select distinct p 
from userlifecyclemgmt_Profile p left join p.legalEntities f 
where p.isAvailableForAll=true or f=:legalEntity

from userlifecyclemgmt_Profile p left join p.legalEntities f 表达式生成 left join 本机查询,其中 returns 纯结果 profile-legalEntityf 成为单个 legalEntity 的别名,不能在 member of 中使用,否则 p.legalEntities 可以。

select p returns 相同的配置文件多次 (legalEntities.size())。所以你需要 distinct.