ee622bcfcdad7b47cad9487acf04f938affa0b70
[institute/sw-backend.git] /
1 package com.supwisdom.institute.backend.common.framework.repo.resultTransformer;
2
3 import com.google.common.collect.Lists;
4 import com.supwisdom.institute.backend.common.util.ReflectUtils;
5
6 import org.hibernate.HibernateException;
7 import org.hibernate.transform.ResultTransformer;
8
9 import java.lang.reflect.Field;
10 import java.util.List;
11
12 /**
13  * 
14  * 修正hibernate返回自定义pojo类型时找不到属性的BUG
15  * 主要发生在使用oracle或高版本的mysql时,查询返回的字段默认是大写的(除非SQL中指定了别名),这导致返回自定义pojo类型时会报找不到属性的错误,该类用于修正此BUG。
16  * 使用该类时SQL返回的字段名大小写或者带"_"都会被忽略,如数据库字段为 USER_NAME,自定义pojo的属性名为username就可以使用
17  * 
18  * @author feng*/
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")){
32                         continue;
33                     }
34                     types.add(fs[i].getType());
35                     ReflectUtils.makeAccessible(fs[i]);
36                     newFs.add(fs[i]);
37                 }
38                 list.addAll(newFs);
39             }
40             this.fields = list.toArray(new Field[list.size()]);
41         }
42          /**
43       * aliases为每条记录的数据库字段名,ORACLE字段名默认为大写
44       * tupe为与aliases对应的字段的值
45       */
46          @Override
47          public Object transformTuple(final Object[] tuple, final String[] aliases) {
48            Object result;
49              try {
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]);
58                                break;
59                                    }
60                           }
61                   }
62            } catch (Exception e) {
63                throw new HibernateException("Could not instantiate resultclass: " + this.resultClass.getName(), e);
64            }
65           return result;
66       }
67       @Override
68       @SuppressWarnings("rawtypes")
69       public List transformList(final List collection) {
70            return collection;
71       }
72 }