Spring JPA Group By,联合主键(多主键)
项目 是Spring boot,想要使用Spring JPA实现Group By 功能,但是Spring支持的查询关键字不包括Group By,只能另辟蹊径了。
表结构:
最上面三个字段组成联合主键。
想要实现的SQL功能:
(select中的参数必须满足上面的三个联合主键,不能少)
SELECT max(trade_date), max(class_type), cat_id
FROM cs_index_pe_ratio_industry
group by cat_id
创建定制方法接口:
public interface CsIndexPeRatioIndustryRepositoryMy {
List<CsIndexPeRatioIndustry> findAllByIdTradeDate();
}
实现类:
public class CsIndexPeRatioIndustryRepositoryMyImpl implements CsIndexPeRatioIndustryRepositoryMy {
@PersistenceContext
private EntityManager entityManager;
public void setEntityManager(EntityManager em) {
this.entityManager = em;
@Override
public List<CsIndexPeRatioIndustry> findAllByIdTradeDate() {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<CsIndexPeRatioIndustry> query = criteriaBuilder.createQuery(CsIndexPeRatioIndustry.class);
Root<CsIndexPeRatioIndustry> root = query.from(CsIndexPeRatioIndustry.class);
query.multiselect(criteriaBuilder.max(root.get("id").get("tradeDate")), criteriaBuilder.max(root.get("id").get("classType")), root.get("id").get("catId"))
.groupBy(root.get("id").get("catId"));
return entityManager.createQuery(query).getResultList();
}
注意 query.multiselect 中参数的排列顺序。
创建主Repository:
public interface CsIndexPeRatioIndustryRepository extends JpaRepository<CsIndexPeRatioIndustry, String>, CsIndexPeRatioIndustryRepositoryMy {
}
使用方法:
@Autowired
CsIndexPeRatioIndustryRepository csIndexPeRatioIndustryRepository;
。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。
List<CsIndexPeRatioIndustry> findAllByIdTradeDate = csIndexPeRatioIndustryRepository.findAllByIdTradeDate();
最重要的是POJO类怎么写:
一定要注意构造方法里面的参数顺序,一定要跟上面的query.multiselect中的参数顺序一致。
public class CsIndexPeRatioIndustry {
public CsIndexPeRatioIndustry() {
public CsIndexPeRatioIndustry(String tradeDate, String classType, String catId) {
this.id = new CsIndexPeRatioIndustryId();
this.id.setTradeDate(tradeDate);
this.id.setClassType(classType);
this.id.setCatId(catId);
@EmbeddedId
protected CsIndexPeRatioIndustryId id;
protected String level;
protected String parentCid;
protected String industryName;
protected String industryNameEn;
protected String industryCode;
}
@Embeddable
public class CsIndexPeRatioIndustryId implements Serializable{
public CsIndexPeRatioIndustryId() {