Spring?Data?JPA實現(xiàn)查詢結(jié)果返回map或自定義的實體類
Spring Data JPA查詢結(jié)果返回map或自定義的實體類
在JPA中我們可以使用entityManager.createNativeQuery()來執(zhí)行原生的SQL語句,并且JPA的底層實現(xiàn)都是支持返回Map對象的。
例如:
- EclipseLink 的
query.setHint(QueryHints.RESULT_TYPE, ResultType.Map);
- Hibernate 的
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
- OpenJPA 的
QueryImpl impl = q.unwrap(QueryImpl.class); impl.setResultClass(Map.class);
本文中使用的是Spring Data JPA(Spring Data JPA 可以理解為 JPA 規(guī)范的再次封裝抽象,底層還是使用了 Hibernate 的 JPA 技術(shù)實現(xiàn)),遂用 Hibernate 的query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)。
1.工具類
@Component public class EntityManagerUtil<T> { @PersistenceContext private EntityManager entityManager; //1.返回map public List<Map<String, Object>> getListMap(String sql){ Query nativeQuery=entityManager.createNativeQuery(sql); nativeQuery.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List resultList=nativeQuery.getResultList(); return resultList; } //2.返回自定義實體類 public List<T> nativeQueryResult(String sql, Class clazz) { sql = Normalizer.normalize(sql, Normalizer.Form.NFKC); sql = sql.replaceAll(".*([';]+|(--)+).*", ""); Query query = entityManager.createNativeQuery(sql); List<T> queryList = query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(clazz)).list(); return queryList; } }
2.具體應(yīng)用
//1.自動注入 @Autowired private EntityManagerUtil entityManagerUtil; //1.返回map String sql="sql語句"; List<Map> list=entityManagerUtil.getListMap(sql); //2.1 返回自定義實體類(方法一) List<實體類> list = entityManagerUtil.nativeQueryResult(sql, 實體類.class); //2.2 返回自定義實體類(方法二 hql)
在hql中使用 select new 包名.類名(屬性1,屬性2……) from 實體類,同時在實體類中添加帶參的構(gòu)造方法,參數(shù)的個數(shù)和順序與(屬性1,屬性2……) 保持一致,這樣我們得到的list中存放的依然是實體類的對象,所查詢到的屬性得到了填充。
spingboot:jpa:Spring data jpa 返回map 結(jié)果集
@PersistenceContext private EntityManager em; /** * 通過時間范圍查詢職位統(tǒng)計結(jié)果 * @param startMonth * @param endMonth * @return */ @Override public String queryPositionByMonthOfYear(String startMonth, String endMonth) { int sumNewPosn =0; int sumCurrPosn =0; int dailyAverage =0; Map<String, Object> resultMap=null; JSONObject jo =null; JSONObject jod =null; String endMonthTmp=null; List<Map<String,Object>> lis = null; try { int tmp = Integer.valueOf(endMonth.split("-")[1])+1; endMonthTmp=Integer.valueOf(endMonth.split("-")[0])+"-"+tmp; String sql = "select left(statistic_time,7) time ,sum(new_position) newPosition ,sum(curr_position) nowRecruitposition from t_cal_positions " + "where statistic_time > '"+startMonth+"' and statistic_time <'"+endMonthTmp+"' group by left(statistic_time,7)"; Query query = em.createNativeQuery(sql); query.unwrap(org.hibernate.SQLQuery.class) .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List<Map<String, Object>> rows = query.getResultList(); if(null!=rows && rows.size()>0){ resultMap = new HashMap<String, Object>(); lis= new ArrayList<Map<String,Object>>(); for (Map<String, Object> map : rows) { if(map.get("time").equals(endMonth)){ // int daynum = DateUtil.getDayOfMonth(Integer.valueOf(endMonth.split("-")[0]),Integer.valueOf(endMonth.split("-")[1])); dailyAverage=Integer.valueOf(String.valueOf(map.get("nowRecruitposition")))/DateUtil.getDateOfMonth(); } lis.add(map); } jo = new JSONObject(); jod = new JSONObject(); jod.put("dailyAverage",dailyAverage); jod.put("list",lis); jo.put("code", EnumHttpStatusType.success.getCode()); jo.put("msg",EnumHttpStatusType.success.getStatus()); jo.put("data",jod); return jo.toString(); } } catch (Exception e) { e.printStackTrace(); } return jo.toString(); }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
攜程Apollo(阿波羅)安裝部署以及java整合實現(xiàn)
這篇文章主要介紹了攜程Apollo(阿波羅)安裝部署以及java整合實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08詳解Java使用JDBC連接MySQL數(shù)據(jù)庫
本文詳細講解了Java使用JDBC連接MySQL數(shù)據(jù)庫的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01IntellJ idea使用FileWatch實時編譯less文件的方法
這篇文章主要介紹了IntellJ idea使用FileWatch實時編譯less文件的相關(guān)資料,需要的朋友可以參考下2018-02-02