@Override
    public List<CategoriaDespesa> readByCriteria(Map<String, Object> criteria, Connection conn) throws Exception {
        List<CategoriaDespesa> lista = new ArrayList<CategoriaDespesa>();
        String sql = "SELECT * from ccategoria_despesa WHERE 1=1";

        //criterio por nome
        String criterionNome = (String) criteria.get(CRITERION_NOME);
        if (criterionNome != null && !criterionNome.trim().isEmpty()) {
            sql += " AND categoria_despesa.nome ILIKE '%" + criterionNome + "%'";
        }

        //criterio por intervalo de valores
        int criterionValorLimite1 = (int) criteria.get(CRITEERION_VALOR_LIMITE_1);
        int criterionValorLimite2 = (int) criteria.get(CRITEERION_VALOR_LIMITE_2);
        if (criterionValorLimite2 != 0) {
            sql += " AND categoria_despesa.valor_limite between " + criterionValorLimite1 + " and " + criterionValorLimite2;
        }

        PreparedStatement ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            //setando categoria de despesa
            CategoriaDespesa categoriaDespesa = new CategoriaDespesa();
            categoriaDespesa.setId(rs.getLong("id"));
            categoriaDespesa.setNome(rs.getString("nome"));
            categoriaDespesa.setValorLimite(rs.getInt("valor_limite"));

            lista.add(categoriaDespesa);
        }
        rs.close();
        ps.close();
        return lista;
    }