hibernate 4.2.5 + mssql 2008 + like + setmaxresults = fail

时间:2015-01-08 17:36:34

标签: sql-server hibernate limit

我需要使用hibernate 4.2.5创建一个分页查询SQLServer2008。

数据库连接正常。

像“FROM ENTITY E ORDER BY E.NOME”这样的简单查询工作正常,甚至分页。

当我使用LIKE添加where子句时,resultset返回空,如果我通过客户端手动将hibernate打印的SQL打印到数据库,结果是正确的。

我搜索了互联网,发现一些错误抱怨使用hql和setmaxresults(),但是,我的简单查询有效,为什么它不在我的第二个场景?

我正在使用SQLServer2008Dialect。

1 个答案:

答案 0 :(得分:0)

经过大量研究后,我发现Hibernate + MSSQL在使用JPA查询与setFirstResult(int)和setMaxResults(int)时存在问题。

解决方案是使用NativeQuery。示例:

            StringBuffer sql = new StringBuffer()
            .append("WITH PAGINATEDQUERY AS ( ")
            .append("     SELECT Q.*, ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as ROWNUM ")
            .append("       FROM ( SELECT TOP(?) * FROM GDHTB_USUARIO ");

        if(!StringUtils.isEmpty(parametro)) {
             sql.append("           WHERE USU_NO like ? ")
                .append("              OR USU_DS_EMAIL like ? ")
                .append("              OR USU_NU_CPF = ? ");
        }

        sql.append("                ORDER BY USU_NO ) Q ) ")

            .append("SELECT USU_CD, USU_IC_ATIVO, USU_NU_CPF, USU_NU_DDD, USU_NU_TELEFONE, USU_DS_EMAIL, USU_ENT_CD, USU_NO, USU_DS_OBSERVACAO, USU_DT_CADASTRO ")
            .append("  FROM PAGINATEDQUERY ")
            .append(" WHERE ROWNUM >= ? ")
            .append("   AND ROWNUM < ? ");

        Query q = getEntityManager().createNativeQuery(sql.toString());

        int i = 1;
        q.setParameter(i++, inicio + pagina);

        if(!StringUtils.isEmpty(parametro)) {
            q.setParameter(i++, "%" + parametro + "%");
            q.setParameter(i++, "%" + parametro + "%");
            q.setParameter(i++, parametro);
        }

        q.setParameter(i++, inicio);
        q.setParameter(i++, inicio + pagina);

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        List<Object[]> resultset = q.getResultList();
        ...