1 package com.supwisdom.institute.backend.common.framework.repo.resultTransformer;
3 import com.google.common.collect.Lists;
4 import com.supwisdom.institute.backend.common.util.ReflectUtils;
6 import org.hibernate.HibernateException;
7 import org.hibernate.transform.ResultTransformer;
9 import java.lang.reflect.Field;
10 import java.util.List;
14 * 修正hibernate返回自定义pojo类型时找不到属性的BUG
15 * 主要发生在使用oracle或高版本的mysql时,查询返回的字段默认是大写的(除非SQL中指定了别名),这导致返回自定义pojo类型时会报找不到属性的错误,该类用于修正此BUG。
16 * 使用该类时SQL返回的字段名大小写或者带"_"都会被忽略,如数据库字段为 USER_NAME,自定义pojo的属性名为username就可以使用
19 public class IgnoreCaseResultTransformer implements ResultTransformer {
20 private static final long serialVersionUID = -3779317531110592988L;
21 private final Class<?> resultClass;
22 private Field[] fields;
23 private List<Class> types = Lists.newArrayList();
24 public IgnoreCaseResultTransformer(final Class<?> resultClass) {
25 this.resultClass = resultClass;
26 List<Field> list = Lists.newArrayList();
27 for (Class<?> superClass = resultClass; superClass != Object.class; superClass = superClass.getSuperclass()) {
28 Field[] fs = superClass.getDeclaredFields();
29 List<Field> newFs = Lists.newArrayList();
30 for(int i=0;i<fs.length;i++){
31 if(fs[i].getName().equals("serialVersionUID")){
34 types.add(fs[i].getType());
35 ReflectUtils.makeAccessible(fs[i]);
40 this.fields = list.toArray(new Field[list.size()]);
43 * aliases为每条记录的数据库字段名,ORACLE字段名默认为大写
44 * tupe为与aliases对应的字段的值
47 public Object transformTuple(final Object[] tuple, final String[] aliases) {
50 result = this.resultClass.newInstance();
51 for (int i = 0; i < aliases.length; i++) {
52 for (int j=0;j<this.fields.length;j++) {
53 String fieldName = this.fields[j].getName();
54 //数据库字段带下划线的时候也能保证使用,如数据库字段为 USER_NAME,自定义pojo的属性名为username就可以使用
55 if (fieldName.equalsIgnoreCase(aliases[i].replaceAll("_", ""))) {
56 ReflectUtils.invokeSetter(result,fieldName,tuple[i],this.types.get(j));
57 // beanUtilsBean.setProperty(result, fieldName, tuple[i]);
62 } catch (Exception e) {
63 throw new HibernateException("Could not instantiate resultclass: " + this.resultClass.getName(), e);
68 @SuppressWarnings("rawtypes")
69 public List transformList(final List collection) {