經過大量研究,我發現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();
...
任何錯誤信息? – Najera
公開名單 pesquisar(字符串parametro,INT INICIO,詮釋pagina)拋出EAOException { ... 回報consultar( 「usuario.pesquisarArgumento」,INICIO,pagina,新JPAParameter [] { 新JPAParameter(「argumento 「,parametro), new JPAParameter(」argumentoLike「,」%「+ parametro +」%「) }); ... } –
公開名單 consultar(@NonNull查詢查詢,INT INICIO,INT numRegistros,JPAParameter ... PARAMS)拋出EAOException { ... 如果(numRegistros> 0){ query.setFirstResult(inicio); query.setMaxResults(numRegistros); } defineParameters(query,params); return query.getResultList(); ... } –