如何从Spring Data JPA GROUP BY查询中实现ORDER BY

时间:2017-04-27 14:08:38

标签: spring spring-mvc spring-data-jpa jpql

根据问题How to return a custom object from a Spring Data JPA GROUP BY query,我的自定义查询正在运行,如下所示:

@Query("select new br.com.cwidevs.dto.Goleador(j.id, sum(pj.gols)) from PartidaJogador pj join pj.id.jogador j group by j.id")
public List<Goleador> getGoleadores();

这是简单的bean类:

public class Goleador {

    private Long jogador;

    private Long totalGols;    
}

此时,如何实施ORDER BY?我可以用Sort来实现这个目标吗?

3 个答案:

答案 0 :(得分:3)

试试这个:

@Entity
public class Goleador {
    //...
}

@Entity
public class PartidaJogador {
    //...

    @ManyToOne
    private Goleador jogador;

    private Long gols;

    //...
}

// DTO as Projection
public interface GoleadorWithGols {
    Goleador getGoleador();
    Long getTotalGols()
}

public interface GoleadorRepo extends JpaRepository<Goleador, Long> {
    @Query("select j as goleador, sum(pj.gols) as totalGols from PartidaJogador pj join pj.jogador j group by j order by totalGols")
    List<GoleadorWithGols> getGoleadores();
}

此处,我们使用projection GoleadorWithGols 作为DTO来获取必要的数据。

更多信息是here

答案 1 :(得分:2)

JpaRepository 扩展 PagingAndSortingRepository ,因此您可以明确地使用Sort

为您的方法添加参数
public List<Goleador> getGoleadores(Sort sort);

当您调用它时,只需指定要对查询进行排序的列,您应该是好的。

repoGoleador.getGoleadores(new Sort("jogador"));  

答案 2 :(得分:0)

我刚刚解决了这个问题:

基于类的Projections不适用于查询

native(@Query(value = "SELECT ...", nativeQuery = true))

因此,我建议使用interface定义自定义DTO。 在使用DTO之前,应先从语法上验证查询是否正确。