休眠 4.2.5 + mssql 2008 + 喜欢 + setmaxresults = 失败
hibernate 4.2.5 + mssql 2008 + like + setmaxresults = fail
我需要使用 hibernate 4.2.5 进行分页查询 SQLServer2008。
数据库连接正常
像 "FROM ENTITY E ORDER BY E.NOME" 这样的简单查询工作正常,甚至分页。
当我添加带有 LIKE 的 where 子句时,结果集 returns 为空,如果我通过客户端手动将 hibernate 打印的 SQL 打印到数据库,则结果是正确的。
我在互联网上搜索并发现一些错误抱怨将 hql 与 setmaxresults() 一起使用,但是,我的简单查询有效,为什么它在我的第二种情况下不起作用?
我正在使用 SQLServer2008Dialect。
经过大量研究,我发现 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();
...
我需要使用 hibernate 4.2.5 进行分页查询 SQLServer2008。
数据库连接正常
像 "FROM ENTITY E ORDER BY E.NOME" 这样的简单查询工作正常,甚至分页。
当我添加带有 LIKE 的 where 子句时,结果集 returns 为空,如果我通过客户端手动将 hibernate 打印的 SQL 打印到数据库,则结果是正确的。
我在互联网上搜索并发现一些错误抱怨将 hql 与 setmaxresults() 一起使用,但是,我的简单查询有效,为什么它在我的第二种情况下不起作用?
我正在使用 SQLServer2008Dialect。
经过大量研究,我发现 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();
...