hibernate使用本地sql語句查詢,解決List Object轉換成List Entity
阿新 • • 發佈:2019-01-09
本人第一次寫技術文件的部落格,可能有什麼語言語法問題,還有技術類的名詞誤解請多包涵,並予以指正方便我和大家更好的學習。廢話不多說,開始進行現在的任務。
我們在使用hibernate框架時,對於程式設計師使用hibernate模板HibernateTemplate進行事務處理。對於增刪改很方便,但是對於查可能很大的問題了。所以我們自己編寫sql語句,不能依賴於Hql。在SSH框架的專案中,我是這樣來處理的。如果哪個網友有更好的方法,歡迎提供!
我想到一個查詢方法,sql語句是這樣的
SELECT * FROM (SELECT o.* FROM shop_goods o ORDER BY o.goods_date DESC ) e LIMIT 3;
不能翻譯成Hql語句,此時要用hibernate執行本地sql語句。
public List<Object[]> findGoodsByDate() { final String sql = "SELECT * FROM (SELECT o.* FROM shop_goods o ORDER BY o.goods_date DESC ) e LIMIT 3"; //執行sql語句 List<Object[]> list = (List<Object[]>) this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { SQLQuery query = session.createSQLQuery(sql); return query.list(); } }); return list; }
service層的interface是這樣的
public List<ShopGoods> findGoodsByDate();
service層中呼叫dao層findGoodsByDate()方法獲取的是List<Object[]>
如何將List<Object[]>轉換成List<ShopGoods>呢?
ShopGoods的實體類是
private String id;//主鍵id, private String goodsName;//商品名稱, private String goodsPrice;//商品價格, private String goodsStatus; //商品狀態, private String goodsDate; //商品上架的日期, private String goodsClass;
service層的方法是
public List<ShopGoods> findGoodsByDate() {
List<Object[]> list = shopGoodsDao.findGoodsByDate();
//將返回的集合封裝成list集合
List<ShopGoods> goodsList = this.shopObjectListTOPOList(list);//抽象一個方法出去
return goodsList;
}
/**值轉換*/
private List<ShopGoods> shopObjectListTOPOList(List<Object[]> list) {
List<ShopGoods> shopGoodsList = new ArrayList<ShopGoods>();
for(int i=0; list != null && i<list.size(); i++) {
Object[] objects = list.get(i);
if(objects.length > 0) {
ShopGoods shopGoods = new ShopGoods();
for(int j=0; j<objects.length; j++) {
shopGoods.setGoodsDate((String)objects[j]);
shopGoods.setGoodsName((String)objects[j]);
shopGoods.setGoodsPrice((String)objects[j]);
shopGoods.setGoodsStatus((String)objects[j]);
shopGoods.setId((String)objects[j]);
}
shopGoodsList.add(shopGoods);
}
}
return shopGoodsList;
}