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; }
這樣就可以把之前對象數組數組轉換為實體類對象數據。(主要是可以記住這個轉換方法)