generic find by id using IN clausule

    Recently I create a new restriction to find entities by PK using the clausule IN.

     

    -----

    package com.ig.ibest.persistence.hibernate.criterion;

     

    import java.util.List;

     

    import org.hibernate.Criteria;

    import org.hibernate.HibernateException;

    import org.hibernate.criterion.CriteriaQuery;

    import org.hibernate.criterion.Criterion;

    import org.hibernate.criterion.Restrictions;

    import org.hibernate.engine.TypedValue;

     

    /**

    * Constraint to find by ID using clausule IN

    *

    * @author hnqoliveira

    *

    */

    public class IdentifierInExpression implements Criterion {

     

        private static final long serialVersionUID = -3120283684494528083L;

        private final Object[] values;

        private Criterion delegate;

     

        public IdentifierInExpression(List<Object> values) {

            this.values = values.toArray();

        }

     

        @Override

        public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {

            String idProp = getIdProperty(criteria, criteriaQuery);

            delegate = Restrictions.in(idProp, values);

            return delegate.toSqlString(criteria, criteriaQuery);

        }

     

        @Override

        public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {

            return delegate.getTypedValues(criteria, criteriaQuery);

        }

     

        @Override

        public String toString() {

            return delegate.toString();

        }

     

        /**

         * Retrieve propertyName that represent the Identifier of table

         *

         * @param criteria

         * @param criteriaQuery

         * @return

         */

        private String getIdProperty(Criteria criteria, CriteriaQuery criteriaQuery) {

            return criteriaQuery.getFactory().getIdentifierPropertyName(criteriaQuery.getEntityName(criteria));

        }

    }

    ------

     

    I create the method in my GenericDAO

     

        public List<T> find(List<ID> ids) throws DAOException {

            if(ids.size() == 1) {

                T obj = find(ids.get(0));

                return (obj != null)?Collections.<T>singletonList(obj):Collections.<T>emptyList();

            }

            try {

                Criteria criteria = createCriteria().add(new IdentifierInExpression(ids));

                return criteria.list();

            } catch (Exception e) {

                throw new DAOException("An error occurs while find entities of class " + clazz+" with ids "+ids, e);

            }

        }