Query和SQLQuery的區別
@Override public Goods checkGoods(Long categoryId, Long tenantId, String cardNo) { String sql = "SELECT " + " * " + "FROM " + " cce_goods " + "WHERE " + " is_deleted = 0" + " AND goods_category_id = '" + categoryId + "' " + " AND commercial_tenant_id ='" + tenantId + "'" + " AND card_no = '" + cardNo + "'"; Query query =null; query=getSession().createSQLQuery(sql).addEntity(Goods.class); query.setParameter("0",1); query.setResultTransformer(Transformers.aliasToBean(Goods.class)); query=getSession().createQuery(sql); return (Goods) query.uniqueResult(); }
今天在做dao層操作時,一不小心寫錯了,得到兩種情況,一種是 query=getSession().createSQLQuery(sql).addEntity(Goods.class);和query=getSession().createQuery(sql)。也是可以的,為什麼能這樣呢?
檢視hibernate底層原始碼時發現,SQLQuery繼承Query介面,如圖所示:
介面的實現指向它的實現類,或者它子介面的實現類。我們需要呼叫addEntity(Goods.class)增加商品類的實體類,hibernate的底層通過反射將資料填充到商品類的例項化的物件中的。但是,介面Query本身是沒有這個方法的,因而,我們需要使用SQLQuery,而不是Query。