我有一对多关系:
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/