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

你可能感兴趣的:(Hibernate在进行SQL查询,并把查询结果绑定到POJO对象)