Hibernate在進行SQL查詢,並把查詢結果綁定到POJO對象。


我們通過注解的方式可以把一個實體對象綁定到一個數據表。然后用Hibernate操作這個對象對表進行數據操作。也可以用Hql來查詢並自動把結果綁定到@Entity對象中。

 

但是我們可能也會碰到這種情況,當我們要做一些數據統計的時候,查詢可能會牽扯到多張表的查詢。所以用Hql可能就達不到我們要查詢的目的,所以我們只能通過SQL的方式,正好Hibernate框架也支持原生的SQL查詢。這時候,我們不想通過遍歷的方式對查詢返回的Object數組來讀取數據,還是想通過把查詢結果綁定到POJO對象,而這個POJO對象又不想被Hibernate管理。

 

如果按照

Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery(sql).addEntity(clazz);

 這種方式的話,查詢就會報出一個結果映射的異常。  如  org.hibernate.MappingException: Unknown entity:

 

這時候,我們可能就得通過下面的這種方式來解決這個問題了

Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(t.getClass()));

 關鍵是

.setResultTransformer(Transformers.aliasToBean(t.getClass()));

以下是完整的代碼,初學者可以借鑒一下。
第一:SQL綁定POJO的方式
@Override
public <T> T getBySqlToPojo(String sql, T t, Object... params) throws Exception {
List<T> tList = listBySqlToPojo(sql, t, params);
T object = null;
if (CollectionUtil.isNotEmpty(tList)) {
object = tList.get(0);
}
return object;
}
@Override
public <T> List<T> listBySqlToPojo(String sql, T t, Object... params) throws Exception {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(t.getClass()));
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
return query.list();
}

第二:SQL綁定實體的方式
@Override
public Object getBySqlToEntity(String sql, Class<? extends AbstractEntity> clazz, Object... params) throws Exception {
List list = listBySqlToEntity(sql, clazz, params);
Object object = null;
if (CollectionUtil.isNotEmpty(list)) {
object = list.get(0);
}
return object;
}
@Override
public List listBySqlToEntity(String sql, Class<? extends AbstractEntity> clazz, Object... params) throws Exception {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery(sql).addEntity(clazz);
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
return query.list();
}


免責聲明!

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



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM