Hibernate原生SQL查詢數據轉換為HQL查詢數據方法


HQL形式:(構造方法不支持timestamp類型

public List<Device> queryByMatherBoardId(String matherBoardId) { String hql = "select new Device(d.id,d.diskSize,d.diskSerial) from Device as d where d.matherBoard=:matherBoard"; return this.getSession().createQuery(hql) .setParameter("matherBoard", matherBoardId).list(); }

  使用這種方式,Device構造方法不支持參數為time類型,會報無法匹配合適的構造方法錯誤。

SQL形式:

public List<Device> queryByMatherBoardId(String matherBoardId) { String sql = "select d.id,d.diskSize,d.diskSerial,d.registerTime from cems_device as d where d.matherBoardId=:matherBoardId order by registerTime asc"; List<Device> list = getSession().createSQLQuery(hql) .setParameter("matherBoardId",matherBoardId) .list(); return list; }

  使用這種方式呢,雖然不會報錯,可以正常查詢數據,但是獲取的數據卻是數組對象,達不到我們需要的實體對象的要求。

  查詢的數據:select d.id,d.diskSize,d.diskSerial,d.registerTime from cems_device as d where d.matherBoardId='D8924D56-414C-ABCC-935A-A9D506926B31' ORDER BY registerTime ASC

  想要得到的數據:像下面這樣實體類對象

  需要像下面這段代碼一樣轉換下:

public List<Device> queryByMatherBoardId(String matherBoardId) { Map<String,Object> map = new HashMap<String,Object>(); String hql = "select d.id,d.diskSize,d.diskSerial,d.registerTime from cems_device as d where d.matherBoardId=:matherBoardId order by registerTime asc"; map.put("matherBoardId",matherBoardId); Query q = getSession().createSQLQuery(hql) .addScalar("id", StandardBasicTypes.STRING) .addScalar("diskSize", StandardBasicTypes.INTEGER) .addScalar("diskSerial", StandardBasicTypes.STRING) .addScalar("registerTime", StandardBasicTypes.TIMESTAMP) .setResultTransformer(Transformers.aliasToBean(Device.class)); q = assignValues(q, map); List<Device> list=(List<Device>)q.list(); return list; } /** * 按名稱綁定 * @param query * @param values * @return */
public Query assignValues(Query query, Map<String, ?> values) { if (values != null) { Set<String> keySet = values.keySet(); for (String string : keySet) { Object obj = values.get(string); if (obj instanceof Collection<?>) { query.setParameterList(string, (Collection<?>) obj); } else if (obj instanceof Object[]) { query.setParameterList(string, (Object[]) obj); } else { query.setParameter(string, obj); } } } return query; }

  這樣就可以把之前對象數組數組轉換為實體類對象數據。(主要是可以記住這個轉換方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。