不能在 where 子句中使用表达式

Cannot use expression in where clause

我想实现 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;
    }

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

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

应重写为:

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