如何从 Spring Data JPA GROUP BY 查询中实现 ORDER BY
How to implement ORDER BY 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 class:
public class Goleador {
private Long jogador;
private Long totalGols;
}
此时,如何实现ORDER BY
?我可以用 Sort 实现吗?
JpaRepository 扩展 PagingAndSortingRepository 所以你可以明确地使用 Sort
将参数添加到您的方法
public List<Goleador> getGoleadores(Sort sort);
当您调用它时,只需指定您要按哪一列对查询进行排序,您就可以了.
repoGoleador.getGoleadores(new Sort("jogador"));
试试这个:
@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();
}
这里我们使用projectionGoleadorWithGols作为DTO来获取必要的数据。
更多信息是here。
我刚刚解决了这个问题:
基于 Class 的 Projections
不适用于查询
native(@Query(value = "SELECT ...", nativeQuery = true))
所以我建议使用接口定义自定义 DTO
。
在使用 DTO
之前应该验证查询在语法上是否正确。
基于问题
@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 class:
public class Goleador {
private Long jogador;
private Long totalGols;
}
此时,如何实现ORDER BY
?我可以用 Sort 实现吗?
JpaRepository 扩展 PagingAndSortingRepository 所以你可以明确地使用 Sort
将参数添加到您的方法
public List<Goleador> getGoleadores(Sort sort);
当您调用它时,只需指定您要按哪一列对查询进行排序,您就可以了.
repoGoleador.getGoleadores(new Sort("jogador"));
试试这个:
@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();
}
这里我们使用projectionGoleadorWithGols作为DTO来获取必要的数据。
更多信息是here。
我刚刚解决了这个问题:
基于Class 的 Projections
不适用于查询
native(@Query(value = "SELECT ...", nativeQuery = true))
所以我建议使用接口定义自定义 DTO
。
在使用 DTO
之前应该验证查询在语法上是否正确。