我要搜索一个“邮政编码”与我的搜索词(例如“ 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%' )