2013-11-23 6 views
1

У меня есть следующий запрос: QueryDSLQueryDsl - оператор ИЛИ не работает

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 o 
from Customer 
where o.person.name like '%:name%' or o.company.name like '%:name%' 

Это генерируется запрос:

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 ? 

Он использует счетчик, потому что это первый запрос, который использует Spring Data для постраничного результата ,

+0

Являетесь ли обязательная собственность компании и человека? Вы проверили, как выглядит SQL-запрос? –

+0

@ TimoWestkämper no, они необязательны ... Я обновил вопрос сгенерированным запросом. спасибо –

ответ

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

Спасибо за ответ! к сожалению, это не сработает. Теперь я понимаю, что Лицо или Компания могут быть нулевыми. Я думаю, что это влияет на запрос. –

+0

, конечно, это влияет на запрос. Все объекты, которые содержат два объекта, не подлежащих обнулению, работают нормально. Знаете ли вы, можно ли решить эту проблему? –

+0

Получаете ли вы те же результаты с моим запросом? Соединения на уровне SQL должны, по крайней мере, быть объединены. Не могли бы вы подтвердить? –

Смежные вопросы