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

Is there any way to do this query in HQL?

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

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

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

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

谢谢。

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

将翻译成 HQL 为

from movies m where m.name like :keyword1 or m.name like :keyword2

查询时需要传递命名参数keyword1keyword2

如果您坚持使用 like 匹配器,您将需要遍历列表并动态生成查询。

另一种选择是在 HQL 中实际使用 IN 子句,但这会使通配符匹配变得不可能。

from movies m where m.name in (:keywords)
Query qry = session.createQuery("From RegistrationBean as rb where rb."+searchCriteria+" like :sf");
qry.setString("sf",'%'+searchField+'%');

我不仅需要这样做,而且还需要在 Spring 数据中的 @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()