java - HQL:LIKE 在空关系中

标签 java hibernate jpa null hql

我有一对多关系:

public class Class1{

    private String attr1;
    private String attr2;

    @OneToOne
    private Class2 object1;

}

public class Class2{
    private String attr3;    
}

关系可以存储空对象(我的意思是 Class1 的实例可以在对象 1 中有空)。我想在所有属性中进行完整搜索,所以我创建了这个 HQL 查询:

SELECT p FROM Class1 p
WHERE 
(
upper(p.attr1) LIKE :filter OR
upper(p.attr2) LIKE :filter OR
upper(p.object1.attr3) LIKE :filter
)

然后我传递一个大写的字符串参数,前后都有“%”:

query.setParameter("filter", "%"+filter.trim().toUpperCase()+"%");

它工作正常,但对于具有 object1 = null 的实体。它永远不会得到那些实体。事实上,如果我删除最后一个条件 (upper(p.object1.attr3) LIKE :filter) 它有效,但我需要包括它。

虽然我应该对这种关系进行 LEFT JOIN,所以我尝试将其写为:

SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1
WHERE 
(
upper(p.attr1) LIKE :filter OR
upper(p.attr2) LIKE :filter OR
upper(p1.attr3) LIKE :filter
)

或者喜欢

SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1
WHERE 
(
upper(p.attr1) LIKE :filter OR
upper(p.attr2) LIKE :filter OR
(p1 is not null AND upper(p1.attr3) LIKE :filter)
)

但没有任何成功。

有什么想法吗?

谢谢。

最佳答案

据我了解,您需要值 p1.attr3 为 null,当它为 not null 时,它应该验证条件。所以,我只是微调你的最后一个查询;

SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1
WHERE 
(
upper(p.attr1) LIKE :filter OR
upper(p.attr2) LIKE :filter OR
(p1.attr3 is null OR upper(p1.attr3) LIKE :filter)
)

关于java - HQL:LIKE 在空关系中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9925050/

相关文章:

java - 为什么等于运算符适用于 128 之前的整数值?

java - Play framework 1.2.4 中的多行标签

java - 无法使用 Spring Data REST 捕获 DataIntegrityViolationException

java - Hibernate Spring JPA session : A different object with the same identifier value was already associated with the session

java - JPA 继承映射多个实现

java - 通过引用子索引从 Firebase 检索数据

java - JVM - 为什么 YoungGen 使用的堆在 gc 之间减少?

java - JPA2.1 - 调用返回 CLOB 的存储过程

java - JPA 作为多线程

java - 来自 Maven 存储库的 JPA 和 Ivy