【问题标题】:Using Hibernate DetachedCriteria for calling aggregate functions使用 Hibernate DetachedCriteria 调用聚合函数
【发布时间】:2011-04-28 09:31:12
【问题描述】:

我有一个DetachedCriteria,用于根据名称字段搜索表。我想让搜索不区分大小写,并且想知道是否有办法在不使用 HQL 的情况下做到这一点。比如:

private void searchByFullName(DetachedCriteria criteria, String searchCriteria) {
        criteria.add(Restrictions.like("fullName", "%" + searchCriteria.toLowerCase() + "%"));
        criteria.addOrder(Order.asc("fullName"));
}

但我想确保它在搜索时会忽略大小写(它必须同时搜索大写和小写),因此它生成的 SQL 应该类似于:

SELECT * FROM Student WHERE ? LIKE toLower(FULL_NAME);

【问题讨论】:

  • 如果该表中有很多行,引擎将不得不执行表扫描,执行toLower(FULL_NAME),您可能不希望这样做。一种替代方法是将其存储为全部小写,或者添加另一列仅用于搜索,您将其全部存储为小写。

标签: sql hibernate hql


【解决方案1】:

您使用的是什么数据库? MySQL LIKE 对 CHAR、VARCHAR 和 TEXT 列不区分大小写(我相信 SQL Server 也是如此)。

http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html

如果您使用的是 PostgreSQL,则需要使用 ILIKE 运算符,因此需要使用 Restrictions.ilike("fullName", name)。

【讨论】:

    【解决方案2】:

    我看到两个选项,

    选项 1:

    private void searchByFullName(DetachedCriteria criteria, String searchCriteria) {
                criteria.add(Restrictions.like("toLower(fullName)", "%" + searchCriteria.toLowerCase() + "%"));
                criteria.addOrder(Order.asc("fullName"));
        }
    

    选项 2:

    private void searchByFullName(DetachedCriteria criteria, String searchCriteria) {
                    criteria.add(Restrictions.sqlRestriction("toLower({alias}.fullName) LIKE '%" + searchCriteria.toLowerCase() + "%'"));
                    criteria.addOrder(Order.asc("fullName"));
            }
    

    我对选项 1 不太乐观。选项 2 应该可以肯定。 {alias} 是一个占位符,让 Hibernate 在创建 SQL 时知道它需要为表添加适当的别名。更多信息http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Restrictions.html#sqlRestriction%28java.lang.String%29

    【讨论】:

      猜你喜欢
      • 2013-02-27
      • 2019-09-17
      • 1970-01-01
      • 2016-05-24
      • 2023-03-15
      • 2020-12-14
      • 2014-04-26
      • 1970-01-01
      • 2011-10-27
      相关资源
      最近更新 更多