我有以下查询:
Query query1 = getEntityManager().createQuery(
" select o from Customer o " +
" where lower(o.person.name) like :name escape '!' " +
" or lower(o.company.name) like :name escape '!'");
我的映射是:
@Entity
public class Customer extends AbstractBaseEntity {
@OneToOne(optional = true, cascade = CascadeType.ALL)
private Company company;
@OneToOne(optional = true, cascade = CascadeType.ALL)
private Person person;
...
}
问题是:
每个客户
可以是一个人
或一个公司
,但不能同时时间。
这意味着这些实体之一将始终为空。
对于我编写的查询,它只会在两个实体都不为空时获取结果,这是我没有预料到的行为。
有谁知道当 Company.name
为 null 时如何创建搜索 Person.name
的查询并搜索 Company.name
当 Person.name
为空时?
我可以进行 2 个单独的查询,但我试图在一个查询中完成所有操作以执行 spring-data-jpa 分页。
最佳答案
为此使用显式 LEFT JOIN
:
SELECT cu from Customer cu
LEFT JOIN cu.person p
LEFT JOIN cu.company co
where lower(p.name) like :name escape '!'
or lower(co.name) like :name escape '!'
关于java - 带有空对象的 JPA 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20166627/