java - 带有空对象的 JPA 查询

标签 java sql jpa

我有以下查询:

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.namePerson.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/

相关文章:

sql - 通配符 sql 仅字母字符

sql - MySQL:带有 LEFT JOIN 的 GROUP_CONCAT

java - 是否有一种最好的方法来克隆模型以仅更改一个条目?

java - @ManyToOne(optional=false) 与 @Column(nullable=false) 有什么区别

java - 在main方法中调用

java - 调用 .text() 方法时 Jsoup 元素不显示

java - 实现StatefulJob时 "delay"是什么意思?

java - 如何使用 intellij IDEA 12 创建 Maven Web 应用程序?

sql - 查找表中的列数

jpa - 如何确定 JPA 行限制查询是否可以有更多行?