1. 程式人生 > 其它 >記錄一次用hibernate做稍微複雜的查詢

記錄一次用hibernate做稍微複雜的查詢

入職一個月後被告知另一個部門缺人,要把我調過去。調過去後,尼瑪用的都至少是十幾年前的技術,但我感覺我第一個月一直在划水(實際上換部門後的前半個月也一直在划水),工資拿的挺心虛的,就沒跑路,先幹著吧。
專案用的好像叫hql,hibernate,springjpa,jpa我知道,前兩個我就不懂了,專案裡一般是在service層裡先用StringBuilder拼接一個SQL語句,再用Query方法執行這句SQL語句,大致程式碼如下:
(誰能告訴我插入的程式碼怎麼換行啊,找不到html格式)
List list; StringBuilder sHql = new StringBuilder(); sHql.append("select ..... from ") .append("(select ...... ) .append("where dm like concat(:dm,'%') ") .append("union all ") .........(略) .append("group by "); Query query = this.getEntityManager().createNativeQuery(sHql.toString()); query.setParameter("傳入引數",dm); list = query.getResultList();


如果要用VO接收的話下面再加一個foreach:
List<Vo> voList = new ArrayList<>(); for (Object o : list) { Object[] arryObjs = (Object[]) o; Vo vo = new Vo(); vo.setL(String.valueOf(arryObjs[0])); vo.setS(String.valueOf(arryObjs[1])); vo.setZ(Long.parseLong(arryObjs[2]))); voList.add(voCzrkTjSpSl); }
上面的寫法好像是hibernate裡較複雜的SQL必須的寫法,如果用如今大部分的呼叫dao的寫法,會報無法解析第二行的SQL;
還有Query方法的createQuery是把SQL語句作為hql語句執行,而createNativeQuery是作為純SQL語句執行,不會報無法解析。

但簡單的查詢我肯定不會用這種字串拼接的寫法,感覺實在是太醜了,用自定義jpa查詢,但專案裡的jpa感覺和我以前練手的jpa還不一樣,以前的用#{}傳值,而專案裡的只能用: 冒號傳值,示例如下:
@Query("select xxxxx,yyyyy,count(1) as zs from table "+ "where dm like "+ "concat(:dm,'%') and "+ "slsj>= :kssj and slsj<= :jssj and "+ "group by xxxx,yyyy" ) public List countBydmAndSj(@Param("dm") String dm, @Param("kssj") String kssj, @Param("jssj") String jssj);


然後在service層呼叫這個介面,用foreach遍歷加到VO裡。我還試過用之前熟悉的寫法,把DAO層的List加上泛型,結果報錯,有說需要把第一句話改成這樣的:
"select new com.demo.java.vo.slVO(xxxxx,yyyyy,count(1) as zs) from table "
改後到for迴圈那裡會報型別轉換失敗的錯誤,嘗試了幾次都改不對,還是換成List了。

感言:
這個新部門好處是很養老,工作少下班早,但我真不想研究這種十幾二十年前的技術,但我入職的第一個月就改了一些bug,調到這個部門後帶薪學習了半個月啥也沒幹,這時候提出跑路實在是難以開口,只能先這樣看看了。