使用Hibernate DetachedCriteria调用聚合函数

时间:2011-04-28 09:31:12

标签: sql hibernate hql

我有一个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);

2 个答案:

答案 0 :(得分:0)

您使用的数据库是什么? 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)。

答案 1 :(得分:0)

我看到两个选项,

选项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