Hibernate执行sql的语法如下:
Query query = getHibernateTemplate().getSessionFactory()
.getCurrentSession().createSQLQuery(sql);
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
备注:
values:为?参数
sql:要执行的sql
此时只需要query.list()即可获取查询的结果,此时的list中每个元素为Object[] 对应的是select *中的列信息,那么
如果指定返回的list已经是封装好的vo元素呢?此时借助反射可以做到如下所示:
for(int i=0;list!=null&&i<list.size();i++){
Object ob=clazz.newInstance();
Field[] fields=clazz.getDeclaredFields();
Object[] objs=((Object[])list.get(i));
for(int j=0;fields!=null&&objs!=null&&j<fields.length&&j<objs.length;j++){
fields[j].setAccessible(true);
logger.info("********fields[j].getName*******"+fields[j].getName());
fields[j].set(ob,objs[j]);
}
relist.add(ob);
}
备注:
clazz:为要封装的类型
relist:为返回的封装好vo的list
上述即可实现hibernate执行sql后自动封装成vo类
切忌:
clazz中声明的属性顺序要跟select中查询的列要一一对应