1. 程式人生 > >Hibernate在進行SQL查詢,並把查詢結果繫結到POJO物件。

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();
}