【问题标题】:HQL query with LIKE having issues带有 LIKE 的 HQL 查询有问题
【发布时间】:2011-07-22 03:59:58
【问题描述】:

我正在使用 HQL 进行搜索查询,并且在找到 LIKE 子句之前一切正常。无论我做什么,似乎都没有正确执行 LIKE 子句。这是我的查询。

String QUERY = "FROM Person as p WHERE p.createUser = : createUser 
     AND p.personId in (SELECT pn.personId FROM PersonName pn WHERE pn.personNameType = 'FIRST' AND pn.name LIKE '%:firstName%')";

(List<Person>)session.createQuery(QUERY).setString("createUser", createUser).setString("firstName", firstName).list();

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

    我们可以使用多个 concat 来解决这个问题。

    SELECT pn.personId FROM PersonName pn WHERE pn.personNameType = 'FIRST' AND pn.name LIKE concat(concat('%', :firstName), '%')
    

    【讨论】:

    • 像魅力一样工作。我用AND pn.name LIKE '%' || :firstName || '%' 表示更短的方式。
    【解决方案2】:

    字符串字面量内的参数未解析。

    您需要通过字符串连接将%s 添加到参数值中 - 无论是在程序端

    String QUERY = "FROM Person as p WHERE p.createUser = : createUser 
         AND p.personId in " +
         "(SELECT pn.personId FROM PersonName pn " + 
         "WHERE pn.personNameType = 'FIRST' " + 
         "AND pn.name LIKE :firstName)";
    
    (List<Person>)session.createQuery(QUERY)
        .setString("createUser", createUser)
        .setString("firstName", "%" + firstName + "%").list();
    

    或在数据库端:

    String QUERY = "FROM Person as p WHERE p.createUser = : createUser 
         AND p.personId in " +
         "(SELECT pn.personId FROM PersonName pn " + 
         "WHERE pn.personNameType = 'FIRST' " + 
         "AND pn.name LIKE CONCAT('%', :firstName, '%'))";
    
    (List<Person>)session.createQuery(QUERY)
        .setString("createUser", createUser)
        .setString("firstName", firstName).list();
    

    【讨论】:

    • 区分大小写怎么样。有没有办法让它不区分大小写?谢谢回复! @axtavt
    • 在查询中将 pn.name 和参数 firstName 转换为小写
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多