2012-05-29 28 views
0

我遇到问题getResultList()。 我的查询在执行时是OK的,并返回700个结果。 在返回列表中,我有700个结果,但列表包含重复数据。 所以我没有全部结果。getresultlist - 查询正常但列表中的数据重复

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

您的查询没有太大意义,我很惊讶它甚至运行。当你在select子句中有一个聚合函数(count,sum,avg等)时,按服务分组。尝试删除该群组。而且,返回null而不是空集合是不好的做法。它强制调用者检查null(因为你在这里做,这是不必要的,因为getResultList()永远不会返回null) –

+0

@JB Nizet:如果在Javadoc中提到返回值是可能的,返回null是绝对可以的,因为它可以避免多余的空列表创建(如果在执行查询之前检测到错误条件 - 在本例中不是这种情况 - 这里返回null实际上是多余的)。 – Johanna

+0

@Johanna。在这种情况下,返回Collections.emptyList()。您将返回一个不可变的空列表,并且不会创建多余的对象。 –

回答

1

您正在使用MySQL,对吧? Oracle不会执行查询,而是会抛出一个错误。

要正确使用group by子句,只允许选择在group by子句中提及的那些行(或表达式)。如果您选择不在group by子句中的行,则此行对于一个组的成员可能具有不同的值。数据库应该返回哪些值? MySQL随意返回其中一个可能的值,但这是不正确的。

在您的查询中,您只需执行select distinct idEscale from ...或按所有必要的列进行分组,然后仅选择那些列或删除group by子句。顺便说一下,独立也可以不使用group by来使用,而且如果真的必要,应该使用distinct,因为这会使查询变得缓慢。

+0

谢谢大家。 我会尝试不同的。我是冬眠初学者:) – yann