/* (non-Javadoc)
   * @see fr.certu.chouette.dao.IDaoTemplate#select(fr.certu.chouette.filter.Filter)
   */
  @SuppressWarnings("unchecked")
  public List<T> select(final Filter filter) {
    logger.debug("invoke select on " + type.getSimpleName());

    Session session = getSession();

    Criteria criteria = session.createCriteria(type);

    // DetachedCriteria criteria = DetachedCriteria.forClass(type);
    criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
    if (!filter.isEmpty()) {
      FilterToHibernateClauseTranslator translator = new FilterToHibernateClauseTranslator();
      criteria.add(
          translator.translate(filter, criteria, getSessionFactory().getClassMetadata(type)));
    }
    if (filter.getOrderList() != null) {
      for (FilterOrder order : filter.getOrderList()) {
        switch (order.getType()) {
          case ASC:
            criteria.addOrder(Order.asc(order.getAttribute()));
            break;
          case DESC:
            criteria.addOrder(Order.desc(order.getAttribute()));
            break;

          default:
            break;
        }
      }
    }
    // HibernateTemplate ht = getHibernateTemplate();
    List<T> beans = null;
    if (filter.getLimit() > 0 || filter.getStart() > 0) {
      logger.debug("call with start and/or limit");
      criteria.setFirstResult(filter.getStart());
      criteria.setMaxResults(filter.getLimit());
      beans = criteria.list(); // ht.findByCriteria(criteria,filter.getStart(),filter.getLimit());
    } else {
      beans = criteria.list(); // ht.findByCriteria(criteria);
    }
    logger.debug(type.getSimpleName() + " founds = " + beans.size());

    return beans;
  }