如何在Spring数据其余查询Querydsl中进行左联接?

时间:2019-08-02 08:00:40

标签: spring left-join spring-data-rest querydsl

我要搜索一个“邮政编码”与我的搜索词(例如“ 133”)匹配的两个地址中的一个。我正在使用Spring Data Rest和QueryDsl。 我需要一个“左外部连接”

问题:生成的查询仅生成该人具有两个地址的结果。 如果他们只有一个,那么就不会进入对邮政编码进行进一步选择的集合。

如何创建“左联接”?

我有一个具有两个地址的“伙伴”对象:OneToOne关系中的“主要”和“发布”:

public class Partner {
...
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "MAINADR_UUID")
    private Adresse hauptanschrif;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "POSTADR_UUID")
    private Adresse postanschrift;
...
}

我有一个合作伙伴存储库:

@RepositoryRestResource(path = "partner", collectionResourceRel = "partner")
public interface PersonRepository extends CrudRepository<Partner, String>,
   QuerydslPredicateExecutor<Partner>, QuerydslBinderCustomizer<QPartner> {

with "customize()"
@Override
default public void customize(
    QuerydslBindings bindings, QPartner qPartner) {

...
// Predicate macht ein hauptanschrift.plz OR postanschrift.PLZ test
        bindings.bind(qPartner.hauptanschrift.postleitzahl).as("postleitzahl").first(
  (path, value) -> {
    value = value.replace("*", "");
    final BooleanExpression partnerPlzPredicate = 
    partnerPredicatesBuilder                         
      .with("hauptanschrift.postleitzahl", QDslOperation.STARTS_WITH, value)                             
      .with("postanschrift.postleitzahl", QDslOperation.STARTS_WITH, value)
    .buildPlzExpression();
    return partnerPlzPredicate;
}); // 1

为谓词生成的JPQL为(例如):     假=真|| startsWith(partner.hauptanschrift.postleitzahl,133)|| startsWith(partner.postanschrift.postleitzahl,133)

(对于oracle)生成的sql是(简化的):

select <list>
from partner partner0_ 
cross join adresse adresse1_ 
cross join adresse adresse2_ 
where 
partner0_.hauptanschrift_uuid=adresse1_.uuid and 
partner0_.postanschrift_uuid=adresse2_.uuid 
and (1=0 
or lower(adresse1_.plz) like '133%'  
or lower(adresse2_.plz) like '133%' )

我需要生成以下内容:

select <list> from partner partner0_ 
left outer join adresse adresse1_ on (partner0_.hauptanschrift_uuid=adresse1_.uuid)
left outer join adresse adresse2_ on (partner0_.postanschrift_uuid=adresse2_.uuid);
where (1=0 
or lower(adresse1_.plz) like '133%'  
or lower(adresse2_.plz) like '133%' )

0 个答案:

没有答案