2013-11-23 2 views
1

나는 다음과 같은 QueryDSL 쿼리가 있습니다QueryDsl - 또는 문이 작동하지

QCustomer customer = QCustomer.customer; 

    BooleanBuilder builder = new BooleanBuilder(); 
    builder.or(customer.person.name.containsIgnoreCase(query)); 
    builder.or(customer.company.name.containsIgnoreCase(query)); 

    return builder; 

을 그리고 쿼리 매개 변수를 포함하는 이름 = 쿼리 및/또는 회사가 포함되어 사람의 결과를 얻을 것으로 기대합니다. 하지만 나는 아무것도 얻지 못합니다.

이 내 Customer 클래스 매핑 :

@OneToOne(orphanRemoval = false, optional = true, cascade = CascadeType.ALL) 
private Company company; 

@OneToOne(orphanRemoval = false, optional = true, cascade = CascadeType.ALL) 
private Person person; 

사람이 내가 여기에 누락 알고 계십니까? 이 봄 데이터 결과 페이지를 매기는 데 사용하는 첫 번째 쿼리이기 때문에 그것은 카운트를 사용

select 
    count(customer0_.uid) as col_0_0_ 
from 
    Customer customer0_ 
cross join 
    Person person1_ 
cross join 
    Company company2_ 
where 
    customer0_.person_uid=person1_.uid 
    and customer0_.company_uid = company2_.uid 
    and (lower(person1_.name) like ? escape '!' or lower(company2_.name) like ? escape '!') limit ? 

:

select o 
from Customer 
where o.person.name like '%:name%' or o.company.name like '%:name%' 

이 생성 된 쿼리는 다음과 같습니다

은이 같은 쿼리를 얻을 것으로 예상 .

+0

회사와 사람 모두 필수 속성입니까? SQL 쿼리가 어떻게 생겼는지 확인 했습니까? –

+0

@ TimoWestkämper 아니오, 선택 사항입니다 ... 생성 된 쿼리로 질문을 업데이트했습니다. 감사합니다 –

답변

3

쿼리가 정상적으로 보입니다. 암시 적 속성 기반 조인이 조인 내부 조인을 만들기 때문에 대부분 잘못된 결과가 나타납니다.

왼쪽 결합을 사용하면 필요한 결과를 얻을 수 있습니다.

QPerson person = QPerson.person; 
QCompany company = QCompany.company; 
BooleanBuilder builder = new BooleanBuilder(); 
builder.or(person.name.containsIgnoreCase(str)); 
builder.or(company.name.containsIgnoreCase(str)); 

query.from(customer) 
    .leftJoin(customer.person, person) 
    .leftJoin(customer.company, company) 
    .where(builder); 
+0

답변 주셔서 감사합니다! 슬프게도 작동하지 않습니다. 이제 나는 사람이나 회사가 null 일 수 있음을 알고 있습니다. 나는 이것이 쿼리에 영향을 미치는 것 같아요. –

+0

이것은 확실히 쿼리에 영향을 미치고 있습니다. 두 개의 nullable이 아닌 객체를 포함하는 모든 엔티티가 정상적으로 작동합니다. 이 문제를 해결할 수 있는지 알고 계셨습니까? –

+0

제안 된 쿼리에서 동일한 결과가 나타 납니까? SQL 레벨의 조인은 최소한 조인 된 채로 남아 있어야합니다. 확인해 주시겠습니까? –