【问题标题】:Is there any way to do this query in HQL?有什么方法可以在 HQL 中执行此查询?
【发布时间】:2016-03-23 15:28:15
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: java sql hibernate hql sql-like


    【解决方案1】:
    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)
    

    【讨论】:

    • 您好,感谢您的回答!我需要使用 SQL 通配符“%”,所以唯一的方法是迭代关键字列表并随时构建查询字符串,对吗?我还需要第二次迭代列表来设置参数吗?谢谢!
    • 是的。但您也可以在同一迭代中创建参数。
    • 在这种情况下,您可能会发现使用标准的? 参数而不是named 参数更容易。
    【解决方案2】:
    Query qry = session.createQuery("From RegistrationBean as rb where rb."+searchCriteria+" like :sf");
    qry.setString("sf",'%'+searchField+'%');
    

    【讨论】:

      【解决方案3】:

      我不仅需要这样做,而且还需要在 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()
      

      【讨论】:

        猜你喜欢
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 2020-07-01
        • 1970-01-01
        • 2019-08-11
        • 2011-01-20
        • 1970-01-01
        相关资源
        最近更新 更多