Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有空对象的JPA查询_Java_Sql_Jpa - Fatal编程技术网

Java 带有空对象的JPA查询

Java 带有空对象的JPA查询,java,sql,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 AbstractBa

我有以下疑问:

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;
...
}
问题是: 每个
客户
可以是
公司
,但不能同时是这两个人。 这意味着其中一个实体将始终为空

对于我编写的查询,它只会在两个实体都不为null时获取结果,这是我没有预料到的行为

有人知道如何创建一个查询,当
Company.name
为空时搜索
Person.name
,当
Person.name
为空时搜索
Company.name


我可以进行两个单独的查询,但我试图在一个查询中完成所有操作,以执行spring数据jpa分页。

为此使用显式的
左连接:

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 '!'

当然但是如果这个人是空的,而我正在寻找一个公司的名字?当然,这只是一个例子来告诉你这个想法:)答案更新。现在请不要告诉我在我的示例中没有
SELECT
part:)当然=)再次感谢。遗憾的是,它不符合OR语句。我在单独的查询中执行并正常工作。这很奇怪。我已经仔细检查了所有参数和语法…另一个想法是使用explict
左连接。如果你不明白,我会稍后再发一个答案。很好!它使用左连接工作!谢谢只需使用左连接编辑您的答案,将其标记为correct=)