【问题标题】:hibernate 4.2.5 + mssql 2008 + like + setmaxresults = fail休眠 4.2.5 + mssql 2008 + 喜欢 + setmaxresults = 失败
【发布时间】:2015-01-08 17:36:33
【问题描述】:

我需要使用 hibernate 4.2.5 进行分页查询 SQLServer2008。

数据库连接正常。

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

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

我在互联网上搜索了一些错误,抱怨将 hql 与 setmaxresults() 一起使用,但是,我的简单查询有效,为什么在我的第二种情况下它不起作用?

我正在使用 SQLServer2008Dialect。

【问题讨论】:

  • public List pesquisar(String parametro, int inicio, int pagina) throws EAOException { ... return advisor("usuario.pesquisarArgumento", inicio, pagina, new JPAParameter[] { new JPAParameter ("argumento", parametro), new JPAParameter("argumentoLike", "%" + parametro + "%") }); ... }
  • public List Consultar(@NonNull Query query, int inicio, int numRegistros, JPAParameter... params) throws EAOException { ... if(numRegistros > 0) { query.setFirstResult(inicio ); query.setMaxResults(numRegistros); } 定义参数(查询,参数);返回查询.getResultList(); ... }
  • 无。结果集为空。 @Najera

标签: sql-server hibernate limit


【解决方案1】:

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

解决方案是使用 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();
        ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多