2012-05-29 2 views
0

getResultList()에 문제가 있습니다. 쿼리가 실행되면 700 번 결과가 반환됩니다. 반환 목록에서 700 개의 결과가 있지만 목록에 중복 데이터가 포함되어 있습니다. 그래서 모든 결과가 없습니다.getresultlist - 목록에는 ok이지만 데이터가 중복됩니다.

public List<EscaleCatalogueKaravel> obtenirListeEscaleKaravelSelonMarche(Integer refMarche, Integer refLangue) { 
    List<EscaleCatalogueKaravel> listeEscales = entityManager.createQuery("select distinct p from EscaleCatalogueKaravel p " + 
      "where p.refMarche=:refMarche and p.refLangue=:refLangue group by idEscale ") 
      .setParameter("refMarche", refMarche) 
      .setParameter("refLangue", refLangue) 
      .getResultList(); 

    if (listeEscales == null || listeEscales.size() == 0) { 
     return null; 
    } 
    return listeEscales; 

} 

아이디어가 있습니까?

+2

귀하의 질의는별로 의미가 없으며, 심지어 실행되는 것에 놀랐습니다. group by는 select 절 (집계, 합계, 평균 등)에 집계 함수가있을 때 사용합니다. 그룹을 삭제 해보십시오. 또한 빈 콜렉션 대신 null을 반환하는 것은 나쁜 습관입니다. getResultList()가 null을 반환하지 않기 때문에 호출자가 null을 확인하도록합니다. –

+0

@JB Nizet : Javadoc에서 가능한 반환 값으로 언급되면 null을 반환하는 것이 절대적으로 좋습니다. 빈리스트의 불필요한 생성을 피할 수있다. (쿼리가 실행되기 전에 에러 조건이 검출된다면 -이 예제에서는 그렇지 않다 - 여기서 null은 실제로 불필요하다). – Johanna

+0

@Johanna. 이 경우 Collections.emptyList()를 반환하십시오. 불변의 빈리스트를 돌려 주어, 불필요한 오브젝트는 생성되지 않습니다. –

답변

1

MySQL을 사용하고 있습니까? 오라클은 쿼리를 실행하지 않고 대신 오류를 발생시킵니다.

group by 절을 올바르게 사용하려면 group by 절에서 언급 한 행 (또는 표현식) 만 선택할 수 있습니다. group by 절에없는 행을 선택하면이 행은 한 그룹의 구성원에 대해 다른 값을 가질 수 있습니다. 다음 중 데이터베이스에서 반환해야하는 값은? MySQL은 임의로 가능한 값 중 하나를 반환하지만 올바르지 않습니다.

귀하의 질문에 당신은 오직 select distinct idEscale from ...만을 입력하거나 필요한 모든 컬럼으로 그룹화하고 그 중 하나만 선택하거나 귀하의 group by 조항을 삭제하십시오. 그건 그렇고, 별개 또한 그룹별로 사용하지 않을 수 있으며, 쿼리가 느려지므로 별명은 정말로 필요한 경우에만 사용해야합니다.

+0

모두에게 감사드립니다. 나는 별개로 시도 할 것이다. 나는 최대 절전 모드 초보자입니다 :) – yann

관련 문제