2013-11-23 39 views
1

我有以下QueryDSL查询:QueryDsl - OR语句不工作

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 ? 

它使用的计数,因为它是春天的数据使用分页结果中的第一个查询。

+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

谢谢你的答案!可悲的是它不起作用。现在我意识到Person或Company可能为空。我认为这影响了查询。 –

+0

当然这会影响查询。包含两个不可为空的对象的所有实体都正常工作。你知道是否有可能解决这个问题? –

+0

你用我的建议查询得到了同样的结果吗? SQL级别的连接至少应该保持连接。你能证实吗? –