Hello List.

I added some methods to GenericDao and of course to GenericDaoHibernate, may
be it is useful to anyone else...

The idea is get a list of objects [ordered if necesary] of a Type using it
parent as a filter... For example: Country -> State, I want to get all
states of US... then i tell the StateDao who is it parent (country), finally
I can use the stateDao to get that list.

This is for the interface GenericDao

    /**
     * Sets the mapped parent attribute
     * @param propiedadPadre the father attribute
     * @see GenericDao#listByParent(Serializable)
     * @see GenericDao#listByParent(Serializable, String)
     */
    void setParentAttribute(String propiedadPadre);

    /**
     * Lets add an order to obtain lists, as is a map used to represent
     * the keys you want to add property and a value representing the
     * order either ascending or descending order for the attribute.
     * @param order map with keys (attributes) and values (asc or desc)e
     * @see GenericDao#listarPorPadre(Serializable)
     * @see GenericDao#listarPorPadre(Serializable, String)
     */
    void setOrder(Map<String,String> order);

    /**
     * fetches all the objects <pre>T</pre> whose father is
<pre>objetoPadre</pre>
     * @param objetoPadre the parent
     * @return all the objects <pre>T</pre> whose father is
<pre>objetoPadre</pre>
     */
    List<T> listByParent(Serializable objetoPadre);

    /**
     * fetches all the objects <pre>T</pre> whose father is
<pre>objetoPadre</pre>
     * @param objetoPadre the parent
     * @param propertyParent the maped parent attribute
     * @return fetches all the objects <pre>T</pre> whose father is
<pre>objetoPadre</pre>
     */
    List<T> listByParent(Serializable objetoPadre, String propiedadPadre);


This is the code to add in the implementation in HibernateGenericDao

    private String propiedadPadre;
    private Map<String, String> order;

    /**
     * @param propiedadPadre the propiedadPadre to set
     */
    public void setParentAttribute(String propiedadPadre) {
        this.propiedadPadre = propiedadPadre;
    }

    public void setOrder(Map<String,String> order) {
        this.order = order;
    }



    /**
     * {...@inheritdoc}
     */
    public List<T> listByParent(Serializable objetoPadre) {
        return listByParent(objetoPadre, propiedadPadre);
    }

    /**
     * {...@inheritdoc}
     */
    @SuppressWarnings("unchecked")
    public List<T> listByParent(Serializable objetoPadre, String
propiedadPadre) {
        logger.info("objetoPadre: " + objetoPadre + ", propiedadPadre: " +
propiedadPadre + ", persistentClass: " + persistentClass);
        Assert.notNull(objetoPadre);
        Assert.notNull(propiedadPadre);
        Assert.notNull(persistentClass);
        DetachedCriteria crit = DetachedCriteria.forClass(persistentClass);
        crit.add(Expression.eq(propiedadPadre, objetoPadre));

        if(order != null){
            Set<String> keys = order.keySet();
            for (String property : keys) {

                Integer index = property.indexOf(".");
                if (index != -1){
                    String alias = property.substring(0, index);
                    log.debug("Creando alias: " + alias);
                    crit.createAlias(alias, alias);
                }

                String asc = order.get(property);
                //by default, the ordering is ascending, even it is empty.
                log.debug("property: " + property + ", ordering: " + asc);
                if("desc".equalsIgnoreCase(asc)){
                    crit.addOrder(Order.desc(property));
                } else {
                    crit.addOrder(Order.asc(property));
                }
            }
        }

        return getHibernateTemplate().findByCriteria(crit);
    }


And finally we can let spring inject the required data as follow...


            <bean id="stateDao"
class="cl.etc.dao.hibernate.GenericDaoHibernate">
                <constructor-arg value="cl.etc.model.State"/>
                <property name="sessionFactory" ref="sessionFactory"/>
                <property name="parentAttribute" value="country"/>
                <property name="order">
                    <map>
                        <entry key="name">
                            <value>asc</value>
                        </entry>
                    </map>
                </property>
            </bean>


Hope this can help...
Best Regards
Oscar

Reply via email to