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進行映射