带有 LIKE % 的 HQL 查询不起作用
HQL query with LIKE % is not wokring
我试图重现这个对我有用的 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 查询中我尝试了这个,但似乎没有得到任何结果:
returns empty list [ ]
HQL 查询:
session.createQuery("... where
t1.Column1 LIKE '%"+"t2.Column2"+"%'
and t1.Column1 LIKE '%"+"t2.Column3"+"%' ").list();
我尝试插入实际值而不是列,它确实有效,但我认为 hibernate 将属性视为原始值而不是遍历对象。
任何人都可以提出一个解决方案,我看到人们用标准来解决这个问题,但主要问题是我没有在这些 类 之间建立任何关联,所以我认为它行不通。
我已经被这个问题困扰了一个多星期了,我想到了一个非常简单的解决方案,但它并不是真正的最佳解决方案,就是为每个循环做一个像这样的循环(保留它作为最后的解决方案) :
//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);
用单引号括起来。
'%t2.Column2%'
您可以使用 Criteria
class 来实现相同的目的,
例如
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
- 将字符串的开头与模式匹配。
更新(解决方案):
更新:正如所怀疑的那样,查询将对象的属性视为原始值而不是要迭代的实际对象,因此我通过添加“+”号采取的方法是错误的,我应该采用函数 'CONCAT' 而不是,它确实解决了我的问题。
session.createQuery("... WHERE lower(t1.Column1) LIKE
Concat(Concat('%',lower(t2.Column2)),'%') and lower(t1.Column1) LIKE Concat(Concat('%',lower(t2.Column3)),'%')").tolist();
我试图重现这个对我有用的 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 查询中我尝试了这个,但似乎没有得到任何结果:
returns empty list [ ]
HQL 查询:
session.createQuery("... where
t1.Column1 LIKE '%"+"t2.Column2"+"%'
and t1.Column1 LIKE '%"+"t2.Column3"+"%' ").list();
我尝试插入实际值而不是列,它确实有效,但我认为 hibernate 将属性视为原始值而不是遍历对象。 任何人都可以提出一个解决方案,我看到人们用标准来解决这个问题,但主要问题是我没有在这些 类 之间建立任何关联,所以我认为它行不通。
我已经被这个问题困扰了一个多星期了,我想到了一个非常简单的解决方案,但它并不是真正的最佳解决方案,就是为每个循环做一个像这样的循环(保留它作为最后的解决方案) :
//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);
用单引号括起来。
'%t2.Column2%'
您可以使用 Criteria
class 来实现相同的目的,
例如
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
- 将字符串的开头与模式匹配。
更新(解决方案):
更新:正如所怀疑的那样,查询将对象的属性视为原始值而不是要迭代的实际对象,因此我通过添加“+”号采取的方法是错误的,我应该采用函数 'CONCAT' 而不是,它确实解决了我的问题。
session.createQuery("... WHERE lower(t1.Column1) LIKE
Concat(Concat('%',lower(t2.Column2)),'%') and lower(t1.Column1) LIKE Concat(Concat('%',lower(t2.Column3)),'%')").tolist();