mapping Hibernate query results to custom class?

前端 未结 8 727
时光说笑
时光说笑 2020-12-01 11:02

Following up on a question I posted yesterday: How to populate POJO class from custom Hibernate query?

Can someone show me an example of how to code the following SQ

相关标签:
8条回答
  • 2020-12-01 11:39

    Below is a result transformer that ignores case:

    package org.apec.abtc.dao.hibernate.transform;
    
    import java.lang.reflect.Field;
    import java.util.Arrays;
    import java.util.List;
    
    import org.hibernate.HibernateException;
    import org.hibernate.property.access.internal.PropertyAccessStrategyBasicImpl;
    import org.hibernate.property.access.internal.PropertyAccessStrategyChainedImpl;
    import org.hibernate.property.access.internal.PropertyAccessStrategyFieldImpl;
    import org.hibernate.property.access.internal.PropertyAccessStrategyMapImpl;
    import org.hibernate.property.access.spi.Setter;
    import org.hibernate.transform.AliasedTupleSubsetResultTransformer;
    
    /**
     * IgnoreCaseAlias to BeanResult Transformer
     * 
     * @author Stephen Gray
     */
    public class IgnoreCaseAliasToBeanResultTransformer extends AliasedTupleSubsetResultTransformer
    {
    
        /** The serialVersionUID field. */
        private static final long serialVersionUID = -3779317531110592988L;
    
        /** The resultClass field. */
        @SuppressWarnings("rawtypes")
        private final Class resultClass;
        /** The setters field. */
        private Setter[] setters;
        /** The fields field. */
        private Field[] fields;
        private String[] aliases;
    
        /**
         * @param resultClass
         */
        @SuppressWarnings("rawtypes")
        public IgnoreCaseAliasToBeanResultTransformer(final Class resultClass)
        {
            if (resultClass == null)
            {
                throw new IllegalArgumentException("resultClass cannot be null");
            }
            this.resultClass = resultClass;
            this.fields = this.resultClass.getDeclaredFields();
        }
    
        @Override
        public boolean isTransformedValueATupleElement(String[] aliases, int tupleLength) {
            return false;
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        public Object transformTuple(final Object[] tuple, final String[] aliases)
        {
            Object result;
    
            try
            {
                if (this.setters == null)
                {
                    this.aliases = aliases;
    
                    setSetters(aliases);
                }
                result = this.resultClass.newInstance();
    
                for (int i = 0; i < aliases.length; i++)
                {
                    if (this.setters[i] != null)
                    {
                        this.setters[i].set(result, tuple[i], null);
                    }
                }
            }
            catch (final InstantiationException | IllegalAccessException e)
            {
                throw new HibernateException("Could not instantiate resultclass: " + this.resultClass.getName(), e);
            }
    
            return result;
        }
    
        private void setSetters(final String[] aliases)
        {
            PropertyAccessStrategyChainedImpl propertyAccessStrategy = new PropertyAccessStrategyChainedImpl(
                                                                                                             PropertyAccessStrategyBasicImpl.INSTANCE,
                                                                                                             PropertyAccessStrategyFieldImpl.INSTANCE,
                                                                                                             PropertyAccessStrategyMapImpl.INSTANCE
                                                                            );
    
            this.setters = new Setter[aliases.length];
            for (int i = 0; i < aliases.length; i++)
            {
                String alias = aliases[i];
                if (alias != null)
                {
                    for (final Field field : this.fields)
                    {
                        final String fieldName = field.getName();
                        if (fieldName.equalsIgnoreCase(alias))
                        {
                            alias = fieldName;
                            break;
                        }
                    }
                    setters[i] = propertyAccessStrategy.buildPropertyAccess( resultClass, alias ).getSetter();
                }
            }
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        @SuppressWarnings("rawtypes")
        public List transformList(final List collection)
        {
            return collection;
        }
    
        @Override
        public boolean equals(Object o) {
            if ( this == o ) {
                return true;
            }
            if ( o == null || getClass() != o.getClass() ) {
                return false;
            }
    
            IgnoreCaseAliasToBeanResultTransformer that = ( IgnoreCaseAliasToBeanResultTransformer ) o;
    
            if ( ! resultClass.equals( that.resultClass ) ) {
                return false;
            }
            if ( ! Arrays.equals( aliases, that.aliases ) ) {
                return false;
            }
    
            return true;
        }
    
        @Override
        public int hashCode() {
            int result = resultClass.hashCode();
            result = 31 * result + ( aliases != null ? Arrays.hashCode( aliases ) : 0 );
            return result;
        }
    }
    
    0 讨论(0)
  • 2020-12-01 11:46

    In case you have a native query, all answers here use deprecated methods for newer versions of Hibernate, so if you are using 5.1+ this is the way to go:

    // Note this is a org.hibernate.query.NativeQuery NOT Query.
    NativeQuery query = getCurrentSession()
                    .createNativeQuery(
                            "SELECT {y.*} , {x.*} from TableY y left join TableX x on x.id = y.id");
    
    
    // This maps the results to entities. 
    query.addEntity("x", TableXEntity.class);
    query.addEntity("y", TableYEntity.class);
    
    query.list()
    
    0 讨论(0)
提交回复
热议问题