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

猜你喜欢

转载自www.cnblogs.com/tangchao-johnny/p/10130302.html