我们通过注解的方式可以把一个实体对象绑定到一个数据表。然后用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 getBySqlToPojo(String sql,T t, Object... params)throws Exception {
List tList = listBySqlToPojo(sql, t, params);
T object =null;
if (CollectionUtil.isNotEmpty(tList)) {
object = tList.get(0);
}
return object;
}
@Override
public List 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 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 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();
}