hql查询不是wokring

sbdsn5lh  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(351)

我试图复制这个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();

我尝试过插入实际值而不是列,它确实有效,但我认为hibernate将属性视为原始值,而不是遍历对象。有人能提出一个解决方案吗,我见过有人用criterias来处理这个问题,但主要的问题是我没有在这些类之间建立任何关联,所以我认为它不起作用。
我已经被这个问题困扰了一个多星期了,一个非常简单的解决方案出现在我的脑海中,但它并不是真正的最佳方案,就是像这样做一个for each循环(将它作为最后的解决方案):

//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);
cx6n0qe3

cx6n0qe31#

用一个倒逗号把它包起来。
“%t2.column2%”

hof1towb

hof1towb2#

你可以用 Criteria 为了实现同样的目标,
例如

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

以下是可用的匹配模式选项列表: MatchMode.ANYWHERE -匹配字符串中的任意位置。 MatchMode.END -将字符串的结尾与模式匹配。 MatchMode.EXACT -将整个字符串与模式匹配。 MatchMode.START -将字符串的开头与模式匹配。

r9f1avp5

r9f1avp53#

更新(解决方案):
更新:正如怀疑的那样,查询将对象的属性视为原始值,而不是实际要迭代的对象,因此我所采用的添加“+”符号的方法是错误的,我应该使用函数“concat”,它确实解决了我的问题。

session.createQuery("... WHERE lower(t1.Column1) LIKE
Concat(Concat('%',lower(t2.Column2)),'%') and lower(t1.Column1) LIKE Concat(Concat('%',lower(t2.Column3)),'%')").tolist();

相关问题