【问题标题】:HQL like operator for case insensitive search类似 HQL 的运算符,用于不区分大小写的搜索
【发布时间】:2012-10-27 07:16:16
【问题描述】:

我正在使用 Jquery 实现自动完成功能,当我输入名称时,它会从 db 中获取记录,存储在 db 中的记录是大写字母和小写字母的混合。我编写了一个 HQL 查询,它以区分大小写的方式获取我的记录,但我需要不考虑大小写来记录。这是查询,

List<OrganizationTB> resultList = null;
Query query = session.createQuery("from DataOrganization dataOrg where dataOrg.poolName   
like '%"+ poolName +"%'");
resultList =  query.list();    

例如:如果我有池名称、HRMS 数据集、Hrms 数据、Hr 数据等...如果我输入 HR 或 hr,我需要获取所有 3 条记录,但我无法做到。

请帮忙...

【问题讨论】:

    标签: spring hibernate spring-mvc sql-like


    【解决方案1】:

    将您的查询更改为

    "from DataOrganization dataOrg where lower(dataOrg.poolName)   
    like lower('%"+ poolName +"%')"
    

    欲了解更多信息,请查看 14.3 doc

    【讨论】:

    • 你不认为poolName.toLowerCase() 是一个比lower('%"+ poolName +"%')" 更好的选择,因为它可以防止HQL 函数转换为数据库特定函数的额外开销吗?
    • @ArunKumar 我认为如果你 poolName.toLowerCase() 然后比较将在 Java-Pojo 上完成,不会有任何 SQL 优化,因为函数 lower 有可能在方言级别有 SQL 优化,将消耗更少的内存,更少的没有。从数据库中获取的对象数。
    【解决方案2】:

    一个好的解决方案是:

    List<OrganizationTB> resultList = null;
    Query query = session.createQuery("from DataOrganization dataOrg where lower(dataOrg.poolName) like lower(:poolName)");
    query.setParameter("poolName", '%'+poolName+'%', StringType.INSTANCE);
    resultList =  query.list();
    

    因此您可以保护您的代码免受 SQL 注入

    【讨论】:

    • 你的表格字段内容和查询字符串都是小写的。
    • 如果你只让一层来做小写工作会更干净。您的左侧被 HQL 小写,右侧被 Java 小写。
    • @horvoje 你是对的。我编辑了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2013-02-17
    相关资源
    最近更新 更多