支持原生SQL不带别名转化为实体BEAN的ResultTransformer

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.beanutils.ConvertUtilsBean;
import org.hibernate.transform.ResultTransformer;
 /**  
 * @create.date: 2015-4-22 下午12:00:09     
 * @comment: <p>支持SQL不需要带别名直接转为实体</p>
 * @author: ganlin
 */ 
public class AliasToBeanForOracle<T> implements ResultTransformer{
	private static final long serialVersionUID = -8456383809338325136L;
    protected static final int PROPERTY_NOT_FOUND = -1;
    private Class<T> resultClass = null;
    private boolean isInitialized = false;
    private PropertyDescriptor[] props = null;
    private int[] aliaseToProp = null;
    private ConvertUtilsBean converter = null;

    public AliasToBeanForOracle(Class<T> class1)
    {
        this.resultClass = class1;
    }

    private void initialize(String[] aliases)
    {
        this.isInitialized = true;
        this.aliaseToProp = new int[aliases.length];
        Arrays.fill(this.aliaseToProp, AliasToBeanForOracle.PROPERTY_NOT_FOUND);
        this.converter = new ConvertUtilsBean();
        //
        try
        {
            this.props = Introspector.getBeanInfo(this.resultClass).getPropertyDescriptors();
            for (int i = 0; i < aliases.length; i++)
            {
                for (int j = 0; j < this.props.length; j++)
                {
                	String fieldName = this.props[j].getName();
                	/**
                	 * 增加了字段到属性的映射,如projectName到project_name
                	 */
                    if (aliases[i].equalsIgnoreCase(fieldName)||
                    		aliases[i].equalsIgnoreCase(BeanUtil.hibernate2field(fieldName)))
                    {
                        this.aliaseToProp[i] = j;
                        break;
                    }
                }
            }
        }
        catch (IntrospectionException e)
        {
            e.printStackTrace();
        }
    }

    @Override
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public List<T> transformList(List collection)
    {
        return collection;
    }

    @Override
    public Object transformTuple(Object[] tuple, String[] aliases)
    {
        if (!this.isInitialized)
        {
            this.initialize(aliases);
        }

        T resultBean = null;
        Class<?> paramType = null;
        Object paramValue = null;
        PropertyDescriptor propDesc = null;
        try
        {
            resultBean = this.resultClass.newInstance();
        }
        catch (InstantiationException e1)
        {
            e1.printStackTrace();
        }
        catch (IllegalAccessException e1)
        {
            e1.printStackTrace();
        }
        for (int i = 0; i < tuple.length; i++)
        {
            try
            {
                if (this.aliaseToProp[i] == AliasToBeanForOracle.PROPERTY_NOT_FOUND || tuple[i] == null)
                {
                    continue;
                }
                propDesc = this.props[this.aliaseToProp[i]];
                //
                paramType = propDesc.getWriteMethod().getParameterTypes()[0];
                paramValue = paramType.isInstance(tuple[i]) ? tuple[i] : this.converter.convert(tuple[i], paramType);
                propDesc.getWriteMethod().invoke(resultBean, paramValue);
            }
            catch (IllegalAccessException e)
            {
                e.printStackTrace();
            }
            catch (IllegalArgumentException e)
            {
                System.out.println("--warning:entity-transform-failure#--class(" + this.resultClass.getSimpleName() + ")--name=" + propDesc.getName() + ",and type = " + paramType + ",and value= " + paramValue);
                // e.printStackTrace();
            }
            catch (InvocationTargetException e)
            {
                e.printStackTrace();
            }
            catch (SecurityException e)
            {
                e.printStackTrace();
            }

        }
        return resultBean;
    }


}


/**
	 * @comment: <p>将实体类属性转成ORACLE字段格式</p>  
	 * @create.date: 2015-3-30 ( 上午11:48:46 )
	 * @author: ganlin 
	 * @param s
	 * @return
	 */
	public static String hibernate2field(String s) {
		if (s == null) {
			return s;
		}
		Pattern p = Pattern.compile("([A-Z])");
		Matcher m = p.matcher(s);
		StringBuffer sb = new StringBuffer();
		while (m.find()) {
			m.appendReplacement(sb, "_" + m.group(1).toLowerCase());
		}
		m.appendTail(sb);
		return sb.toString();
	}


使用此自定义的ResultTransformer

@SuppressWarnings("unchecked")
	public PaginationObject<T> findPaginationEntityBySql(String sql,PaginationObject<T> paginationObject) {
		List<T> beanList = new ArrayList<T>();
		try {
			Session session = this.getEntityManager().unwrap(org.hibernate.Session.class);	
			paginationObject.setRowCount(session.createSQLQuery(sql).list().size());
			Query query = session.createSQLQuery(sql).setFirstResult((paginationObject.getPageNum())*paginationObject.getPageSize())
			.setMaxResults(paginationObject.getPageSize()).setResultTransformer(new AliasToBeanForOracle(getObjectClass())); 
			beanList = query.list();
			paginationObject.setResultList(beanList);
			paginationObject.setPageNum(paginationObject.getPageNum()+1);	

		} catch (Exception e) {
			e.printStackTrace();
		} 
		return paginationObject;
	}


PaginationObject是分页用的DTO

上面方法的sql参数可以直接使用带*号的SQL查询语句,对我这样有代码洁癖的人真是太好了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值