具有LIKE%的HQL查询未唤醒

问题描述 投票:0回答:2

我试图重现这个对我有用的SQL查询,还没有复制隐私问题的确切语法,但是我认为您从此查询中获得了目的。

SELECT t1.Column1, t2.Column2, t2.Column3
FROM Table1 as t1
INNER JOIN Table2 as t2 ON t1.Column1 LIKE %t2.Column2%
INNER JOIN Table2 as t2 ON t1.Column1 LIKE %t2.Column3% ;

在HQL查询中,我尝试了这个,但似乎没有得到任何结果:

返回空列表[]

HQL查询:

session.createQuery("... where
t1.Column1 LIKE '%"+"t2.Column2"+"%'
and t1.Column1 LIKE '%"+"t2.Column3"+"%' ").list();

我试图插入实际值而不是列,它确实起作用,但是我认为休眠将属性视为原始值,而不是遍历对象。任何人都可以提出解决方案的建议,我见过有人用标准来解决这个问题,但是主要的问题是我没有在这些类之间建立任何关联,所以我认为这没有用。

我已经被这个问题困扰了一个多星期,我想到了一个非常简单的解决方案,但这并不是真正的最佳选择,它正在像这样的每个循环上做一个(最后解决):

//list1 of query result unique column2 values
//list2 of query result unique column3 values
for each (list1)
for each (list2)
HashSet<Object,Object> result = Session.createQuery("... where
t1.Column1 LIKE '%"+":list1"+"%'
and t1.Column1 LIKE '%"+":list2"+"%'").setParameter("list1",list1).setParameter("list2",list2).tolist();
HashSet<Object,Object> lastresult= new HashSet();
lastresult.add(result);

更新(解决方案):

更新:令人怀疑的是,查询将对象的属性视为原始值,而不是要从其迭代的实际对象,因此我通过添加“ +”号采取的方法是错误的,我应该改用函数“ CONCAT”,确实解决了我的问题。

session.createQuery("... WHERE lower(t1.Column1) LIKE
Concat(Concat('%',lower(t2.Column2)),'%') and lower(t1.Column1) LIKE Concat(Concat('%',lower(t2.Column3)),'%')").tolist();
java sql hibernate jpa hql
2个回答
0
投票

用单个倒逗号括起来。

'%t2.Column2%'


0
投票

您可以使用Criteria类来完成相同的事情,

例如

Criteria query = session.createCriteria(POJO class here);
query.add(Restrictions.like("t1.Column1", "t2.Column3", MatchMode.ANYWHERE));

下面是可用的MatchMode选项的列表:

MatchMode.ANYWHERE-匹配字符串中任意位置的模式。MatchMode.END-将字符串的结尾与模式匹配。MatchMode.EXACT-将整个字符串匹配到模式。MatchMode.START-将字符串的开头与模式匹配。

© www.soinside.com 2019 - 2024. All rights reserved.