spring data jpa多表聚合分組查詢


 

spring data jpa用於單表操作較為友好,對於實現部分查詢,以及多表關聯,而且涉及到聚合,分組,排序,分頁,可使用原生sql形式,對於結果的映射接收,普通的DTO對象無法正常接收,可以手動映射或者定義Entity;

 

1)手動去封裝結果集

       
    public List<StatisticItemNameVo> statisticItemName(String modality, Timestamp queryDate) {
        StringBuilder sb = new StringBuilder();
        sb.append("SELECT e.item_name as itemName,count( * ) as itemNameCount ");
        sb.append("FROM ris_examine_info e ");
        sb.append("LEFT JOIN ris_report_info r ON e.examine_no = r.examine_no ");
        sb.append("WHERE ");
        sb.append("e.modality = ? ");
        sb.append("AND to_days(r.audit_date) = to_days(?) ");
        sb.append("GROUP BY e.item_name ");
        String sql = sb.toString();
        Query nativeQuery = this.entityManager.createNativeQuery(sql.toString());
        nativeQuery.setParameter(1, modality);
        nativeQuery.setParameter(2, queryDate);
        List resultList = nativeQuery.getResultList();
        ArrayList<ItemNameAndCount> listQuery = Lists.newArrayList();
        for (Object row : resultList) {
            ItemNameAndCount itemNameAndCount = new ItemNameAndCount();
            Object[] cells = (Object[]) row;
 String name = (String) cells[0]; BigInteger count = (BigInteger) cells[1];
            itemNameAndCount.setItemName(name);
            itemNameAndCount.setItemNameCount(count.longValue());
            listQuery.add(itemNameAndCount);
        }

        List<StatisticItemNameVo> list = getStatisticItemNameVos(listQuery);
        return list;
    }
  

 

 

 

2)將查詢結果自定義成Entity

    @Test
    public void test1(){

        String sql = " select id, count(*) as count, age, sex from student group by age,sex ";
        Query nativeQuery = entityManager.createNativeQuery(sql,TrialQueryResult.class);
        List<Student> resultList = nativeQuery.getResultList();

    }

 

 
        
@Data
@Entity
public class Student {

    @Id
    private Integer id;

    private Integer age;

    private Integer sex;
    
    private Integer count;
}

數據庫表並沒有student這張表,是自定義的類,但是需要標識為Entity,並且需要標識主鍵id;
此外sql的查詢結果需要滿足這個類的全部字段,否則報錯;
此外還要注意字段名稱要跟sql結果列的名稱一致,不一致需要@Column進行映射
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM