网上查资料,实践后,将自己总结的二种有效方案分享出来:
方案一(推荐方案):
List<Map<String, Object>> list = query.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).getResultList();
return JSON.parseArray(JSON.toJSONString(list), clz);
方案二:
/**
* 转换成页面需要的实体对象
*
* @param list
* @param clazz 实体构造的参数个数、类型必须与查询返回的结果集一致
* @param <T>
* @return
* @throws Exception
*/
public static <T> List<T> transformEntityVo(List<Object[]> list, Class<T> clazz) throws Exception {
List<T> listRecords = new ArrayList<T>();
if (null == list || list.isEmpty()) return listRecords;
Object[] co = list.get(0);
Class[] c2 = new Class[co.length];
for (int i = 0; i < co.length; i++) {
c2[i] = co[i].getClass();
}
for (Object[] o : list) {
Constructor<T> constructor = clazz.getConstructor(c2);
listRecords.add(constructor.newInstance(o));
}
return listRecords;
}
使用方式:
XXDataUtil.transformEntityVo(entityManager.createNativeQuery(sql.toString()).getResultList(), Entity.class);