2015-01-08 85 views
0

我需要使用hibernate 4.2.5進行分頁查詢SQLServer2008。hibernate 4.2.5 + mssql 2008 + like + setmaxresults = fail

數據庫連接正常。

簡單的查詢,如「來自E.NOME的實體E訂單」工作正常,甚至分頁。

當我使用LIKE添加where子句時,resultset返回空,如果我通過客戶端手動獲取由數據庫手動添加到數據庫的SQL,結果是正確的。

我搜索了互聯網,發現一些錯誤抱怨使用hql與setmaxresults(),但是,我的簡單查詢工作,爲什麼它不在我的第二個場景?

我正在使用SQLServer2008Dialect。

+0

任何錯誤信息? – Najera

+0

公開名單 pesquisar(字符串parametro,INT INICIO,詮釋pagina)拋出EAOException { ... 回報consultar( 「usuario.pesquisarArgumento」,INICIO,pagina,新JPAParameter [] { 新JPAParameter(「argumento 「,parametro), new JPAParameter(」argumentoLike「,」%「+ parametro +」%「) }); ... } –

+0

公開名單 consultar(@NonNull查詢查詢,INT INICIO,INT numRegistros,JPAParameter ... PARAMS)拋出EAOException { ... 如果(numRegistros> 0){ query.setFirstResult(inicio); query.setMaxResults(numRegistros); } defineParameters(query,params); return query.getResultList(); ... } –

回答

0

經過大量研究,我發現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(); 
     ... 
相關問題