【问题标题】:Cannot use expression in where clause不能在 where 子句中使用表达式
【发布时间】:2017-01-15 05:25:00
【问题描述】:

我想实现 DataTable 的服务器端过滤。这是检索列表的服务方法:

    @Override
    @Transactional
    public List<User> list(int start, int length, String search, int triIdx, String ordreTri) {

        String hql = "from User ";

        if (!search.equals("") && search != null) {

            hql = hql.concat(" where ");

            if (NumberUtils.isNumber(search))
                hql = hql.concat(" salary ");
            else
                hql = hql.concat(" lower(username) ");

            hql = hql.concat(" like lower('%:critere%') ");

        }

        if (ordreTri.equals("asc")) {
            switch (triIdx) {
                case 0:
                    hql = hql.concat(" order by username ");
                    break;
                case 1:
                    hql = hql.concat(" order by email ");
                    break;
                case 2:
                    hql = hql.concat(" order by salary ");
                    break;
                default:
                    hql = hql.concat(" order by username ");
                    break;
            }
        } else {
            switch (triIdx) {
            case 0:
                hql = hql.concat(" order by username desc");
                break;
            case 1:
                hql = hql.concat(" order by email desc");
                break;
            case 2:
                hql = hql.concat(" order by salary desc");
                break;
            default:
                hql = hql.concat(" order by username desc");
                break;
            }
        }

        Query query = sessionFactory.getCurrentSession().createQuery(hql);
        query = query.setParameter("critere",search);
        query = query.setFirstResult(start);
        query = query.setMaxResults(length);

        @SuppressWarnings("unchecked")
        List<User> listUser = (List<User>) query.list();
        return listUser;
    }

在运行时,我收到有关数据的 dataTable 警报错误。那么我的代码有什么问题呢?

【问题讨论】:

  • 没有标准。您的字符串被转义,因此查询按原样执行并且不包含名为critere 的条件。在设置它之前删除转义和前缀/后缀%

标签: spring hibernate spring-mvc spring-4 hibernate-4.x


【解决方案1】:
hql.concat(" like lower('%:critere%') ")

应该改写为:

hql.concat(" like :critere ")
query = query.setParameter("critere", "%" + search.toLowerCase(Locale. ....) + "%");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2012-04-25
    • 2013-09-12
    • 2010-11-06
    • 2014-02-23
    相关资源
    最近更新 更多