@Override
    public List<Usuario> readByCriteria(Map<String, Object> criteria, Connection conn) throws Exception {
        List<Usuario> lista = new ArrayList<Usuario>();
        String sql = "SELECT usuario.tipo,usuario.login,usuario.senha,usuario.nome,usuario.cpf,usuario.rg,usuario.emailcorporativo,usuario.emailpessoal,usuario.telefonecorporativo,usuario.telefonepessoal, empresa.id as empresa_id, empresa.nome as empresa_nome FROM empresa right join usuario on usuario.empresa_fk = empresa.id WHERE 1=1";

        String criterionTipoEq = (String) criteria.get(CRITERION_TIPO_EQ);
        if (criterionTipoEq != null && !criterionTipoEq.trim().isEmpty()) {
            sql += " AND usuario.tipo = '" + criterionTipoEq + "'";
        }

        String criterionUsuarioEq = (String) criteria.get(CRITERION_USUARIO_EQ);
        if (criterionUsuarioEq != null) {
            sql += " AND usuario.login = '" + criterionUsuarioEq + "'";
        }
        
        String criterionSenhaEq = (String) criteria.get(CRITERION_SENHA_EQ);
        if (criterionSenhaEq != null) {
            sql += " AND usuario.senha = '" + criterionSenhaEq + "'";
        }
        

        //Pesquisa por nome do usuário
        String criterionNomeILike = (String) criteria.get(CRITERION_NOME_I_LIKE);
        if (criterionNomeILike != null && !criterionNomeILike.trim().isEmpty()) {
            sql += " AND lower(nome) ilike '%" + criterionNomeILike + "%'";
        }

        Statement s = conn.createStatement();
        ResultSet rs = s.executeQuery(sql);
        while (rs.next()) {
            Usuario e;
            String tipo = rs.getString("tipo");
            if (tipo.equalsIgnoreCase(TIPO_ADMINISTRADOR)) {
                e = new Administrador();
            } else {
                if (tipo.equalsIgnoreCase(TIPO_FINANCEIRO)) {
                    e = new Financeiro();
                } else {
                    e = new Solicitante();
                }
            }

            e.setTipo(rs.getString("tipo"));
            e.setLogin(rs.getString("login"));
            e.setSenha(rs.getString("senha"));
            e.setNome(rs.getString("nome"));
            e.setEmailCorporativo(rs.getString("emailcorporativo"));
            e.setEmailPessoal(rs.getString("emailpessoal"));
            e.setTelefoneCorporativo(rs.getString("telefonecorporativo"));
            e.setTelefonePessoal(rs.getString("telefonepessoal"));
            
            //Empresa
            Empresa empresa = new Empresa();
            empresa.setId(rs.getLong("empresa_id"));
            empresa.setNome(rs.getString("empresa_nome"));
            e.setEmpresa(empresa);
            
            lista.add(e);
        }
        rs.close();
        s.close();
        
        return lista;
    }