hibernate的sql查詢出來封裝實體的兩種方式
阿新 • • 發佈:2019-01-28
1.在用hibernate的查詢資料庫時,即可以用hql,也可以用sql語句至於用hql語句查出來的結果可以是一個實體物件
如:
public List<CraGovernment> getAll() {
String sql = "from CraGovernment as o";
Query query = sessionFactory.getCurrentSession().createQuery(sql);
return query.list();
}
2.在使用sql語句時,查詢出來後要轉換一下,可以自己轉成與資料庫對應的hibernate的對映物件,也可以是dto,如果是hibernate的對映檔案對應的直接加入
addEntity(GovernmentRecordType.class)
就可以了,否則採用下面的方式,這樣結果就可以是一個實體物件。
public List<GovernmentRecordType> getRecordTypeById(Long governmentId) { String sql = "select o.id as id ,o.neirong_id as governmentId,o.wenzhong_id as recordTypeId from neirong_wenzhong as o where o.neirong_id ="+governmentId; // Query query = sessionFactory.getCurrentSession().createSQLQuery(sql).addEntity(GovernmentRecordType.class);//不能用該方法因為不存在hibernate的xml檔案與資料庫對應的表 Query query = sessionFactory.getCurrentSession().createSQLQuery(sql) .addScalar("id",Hibernate.LONG) .addScalar("governmentId",Hibernate.LONG) .addScalar("recordTypeId",Hibernate.LONG) .setResultTransformer(Transformers.aliasToBean(GovernmentRecordType.class)); return query.list(); }
後來又發現另一種使用方式:
public List<Researcher> getPublicResearcherForHot(int rowStart, int numberOfResultsToShow) { String sql = "select * from ir_researcher.researcher as re " + " where re.researcher_id in (select t.researcher_id from " + " (select r.researcher_id,count(*) as num from " + " ir_researcher.researcher_subscription as r " + " group by r.researcher_id ORDER BY num desc)as t)"; // Query query = hbCrudDAO.getSessionFactory().getCurrentSession().createQuery(hql); Query query = hbCrudDAO.getSessionFactory().getCurrentSession().createSQLQuery(sql) .addEntity("re",Researcher.class); query.setFirstResult(rowStart); query.setMaxResults(numberOfResultsToShow); return query.list(); }