有没有办法在HQL中执行此查询?

时间:2016-03-23 15:28:16

标签: java sql hibernate hql sql-like

我是Hibernate的新手,我正在用Java创建一个简单的电影查找应用程序。我需要在我的dao中进行查询,以便通过关键字列表搜索电影。我知道如何在SQL中执行此操作,但我想知道是否有任何方法可以使HQL查询执行此操作。 dao中的Java方法接收一个List,它是一个keyowrds列表,SQL语句是这样的:

SELECT *
FROM movies
WHERE name LIKE '%keyword1%' OR name LIKE 'keyword2' ...

因此,要实现这一点,必须迭代所有列表并连接每个关键字的查询。

可以在HQL中使这个查询更简单,因此您可以将一个关键字列表传递给que查询,以便它可以将它与LIKE语句一起使用?

感谢。

3 个答案:

答案 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()