我是Hibernate的新手,我正在用Java创建一个简单的电影查找应用程序。我需要在我的dao中进行查询,以便通过关键字列表搜索电影。我知道如何在SQL中执行此操作,但我想知道是否有任何方法可以使HQL查询执行此操作。 dao中的Java方法接收一个List,它是一个keyowrds列表,SQL语句是这样的:
SELECT *
FROM movies
WHERE name LIKE '%keyword1%' OR name LIKE 'keyword2' ...
因此,要实现这一点,必须迭代所有列表并连接每个关键字的查询。
可以在HQL中使这个查询更简单,因此您可以将一个关键字列表传递给que查询,以便它可以将它与LIKE语句一起使用?
感谢。
答案 0 :(得分:1)
helper
将HQL转换为
str = {'x2 = -S1_2*(r1+a*K+a*P)+k*KS1_1+d*(PS1_1+KS1_2);'; ...
'x3 = -S1_3*(r1+a*K+a*P)+k*KS1_2+d*(PS1_2+KS1_3);'; ...
'x4 = -S1_4*(r1+a*K+a*P)+k*KS1_3+d*(PS1_3+KS1_4);'; ...
'x5 = -S1_5*(r2+a*K+a*P)+k*KS1_4+d*(PS1_4+KS1_5);' ...
};
查询时,您需要传递命名参数>> A = testcode(str)
A =
'x2 = -y(2)*(r1+a*K+a*P)+k*y(52)+d*(y(102)+y(53));'
'x3 = -y(3)*(r1+a*K+a*P)+k*y(53)+d*(y(103)+y(54));'
'x4 = -y(4)*(r1+a*K+a*P)+k*y(54)+d*(y(104)+y(55));'
'x5 = -y(5)*(r2+a*K+a*P)+k*y(55)+d*(y(105)+y(56));'
和SELECT *
FROM movies
WHERE name LIKE '%keyword1%' OR name LIKE 'keyword2'
。
如果您坚持使用from movies m where m.name like :keyword1 or m.name like :keyword2
匹配器,则需要循环遍历列表并动态生成查询。
另一种选择是在HQL中实际使用keyword1
子句,但这会使通配符不可能。
keyword2
答案 1 :(得分:0)
Query qry = session.createQuery("From RegistrationBean as rb where rb."+searchCriteria+" like :sf");
qry.setString("sf",'%'+searchField+'%');
答案 2 :(得分:0)
不仅需要执行此操作,还需要在Spring Data的@Query
批注中执行此操作。这是我得到它的唯一方法。 (请记住,这是在界面中。)
@Query(value="from Movie h where lower(h.name) like concat('%',lower(:term),'%'")
List<Movie> findLike(@Param("term") String term);
我调用lower()
使其不区分大小写,然后使用concat()
函数添加%字符。当我这样写时,它不起作用:
@Query(value="from Movie h where lower(h.name) like lower(%:term%)")
List<Movie> findLike(@Param("term") String term); // Query doesn't work! Use concat()
如果不区分大小写,它甚至不能像这样工作:
@Query(value="from Movie h where h.name like %:term%")
List<Movie> findLike(@Param("term") String term); // Query doesn't work! Use concat()