Converter a informação "M" da coluna "sexo" para "Masculino" pela classe DAO

A conversão estava sendo feita pela classe do DTO, porém surgiu a necessidade de converter essa inofrmação pela classe DAO.


public List<UsuarioDTO> listar() {
		
		List<UsuarioDTO> lista = null;
		String sql = "select * from usuario";

		try {
			stmt = conn.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();

			lista = new ArrayList<UsuarioDTO>();
			while (rs.next()) {
				UsuarioDTO usuario = new UsuarioDTO();

				usuario.setId(rs.getLong("id_usuario"));
				usuario.setNome(rs.getString("nome_usuario"));
				usuario.setEmail(rs.getString("email_usuario"));
				
				
					
				usuario.setSexo(rs.getString("sexo_usuario"));
				
				Date data = rs.getDate("dataNascimento_usuario");
				usuario.setDataNascimento(DataUtil.parseData(data));
				lista.add(usuario);
			}

			rs.close();
			stmt.close();

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}

		return lista;
	}

Crie um enum sexo, com código e valor. código vai ser ‘M’ e o value “Masculino”.
Assim vc consegue pegar o nome completo do sexo sem problemas

Eu já criei a classe [color=red]SexoEnumerarion [/color] na tela de cadastro a informação vem como “Masculino” e passa para o Banco “M”. Porém na tela “listar.jsp” a informação vem como CHAR “M”.


Public enum SexoEnumeration {
    
	MASCULINO("M", "Masculino"), FEMININO("F", "Feminino");

    private final String code;
    private final String message;

    /**
     * Construtor do enum
     * @param code - Valor do enum
     * @param message - Label do enum
     */
    private SexoEnumeration(String code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * Returns field code.
     * @return code
     */
    public String getCode() {
        return code;
    }

    /**
     * Returns field message.
     * @return message
     */
    public String getMessage() {
        return message;
    }

    /**
     * Lista retorna valores do Enum
     * @return vRetorno
     */
    public static List<SexoEnumeration> getValues() {
        List<SexoEnumeration> vRetorno = new ArrayList<SexoEnumeration>();

        SexoEnumeration[] vList = SexoEnumeration.values();

        for (SexoEnumeration vSexo : vList) {
            vRetorno.add(vSexo);
        }
        return vRetorno;
    }
}

Tentaria algo assim:

usuario.setSexo(SexoEnumeration.valueOf(rs.getString(“sexo_usuario”)).getMessage());

Cria um método na Enum:

valueOfCode(String code) { for(E e : E.values()) { if(e.getCode().equals(code)) { return e; } } return null; }

Ai recupera assim:
E e = E.valueOfCode(rs.getString(“COLUNA_DO_BANCO_COM_O_CODIGO”));

Onde ‘E’ é sua enumeração(SexoEnumeration se não me engano). É melhor por a enumeração no seu DTO do usuário, melhor que por a String.

Não teve erro na imlementação, mas ao executar me deparei com o seguinte erro 500.

HTTP Status 500 - No enum constant br.com.utdd.cadastro.enumeration.SexoEnumeration.M

type Exception report

message No enum constant br.com.utdd.cadastro.enumeration.SexoEnumeration.M

description The server encountered an internal error (No enum constant br.com.utdd.cadastro.enumeration.SexoEnumeration.M) that prevented it from fulfilling this request.

exception

java.lang.IllegalArgumentException: No enum constant br.com.utdd.cadastro.enumeration.SexoEnumeration.M
	java.lang.Enum.valueOf(Unknown Source)
	br.com.utdd.cadastro.enumeration.SexoEnumeration.valueOf(SexoEnumeration.java:1)
	br.com.utdd.cadastro.dao.UsuarioDAO.listar(UsuarioDAO.java:103)
	br.com.utdd.cadastro.action.CadastroAction.listar(CadastroAction.java:75)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

Foi o que disse na resposta acima, não existe a enumeração SexoEnumeration.M, tem SexoEnumeration.MASCULINO, então para recuperar o valor pelo código(‘M’) vc vai precisar implementar o método citado acima.

valueOfCode(String code) { for(SexoEnumeration e : SexoEnumeration.values()) { if(e.getCode().equals(code)) { return e; } } return null; }

Ok, ela demorou a apareceu so depois.

Obrigado pela ajuda!!

qual implementação vc usou ??

Eu estou implementando no UsuarioDAO, so que agora ele retornqa todos como “FEMININO”.


	public List<UsuarioDTO> listar() {
		
		List<UsuarioDTO> lista = null;
		String sql = "select * from usuario";

		try {
			stmt = conn.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();

			lista = new ArrayList<UsuarioDTO>();
			while (rs.next()) {
				UsuarioDTO usuario = new UsuarioDTO();

				usuario.setId(rs.getLong("id_usuario"));
				usuario.setNome(rs.getString("nome_usuario"));
				usuario.setEmail(rs.getString("email_usuario"));
//				usuario.setSexo(rs.getString("sexo_usuario"));
				
				if (rs.getString("sexo_usuario") == "M")
					
					usuario.setSexo("Masculino");
				else 
					usuario.setSexo("Feminino");
				
				Date data = rs.getDate("dataNascimento_usuario");
				usuario.setDataNascimento(DataUtil.parseData(data));
				lista.add(usuario);
			}

			rs.close();
			stmt.close();

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}

		return lista;
	}

}

comparar String é com o método equals da classe String, não com ==

Isso mesmo, funcionou muito obrigado pela ajuda!!!

Rapaz, era pra fazer assim, usando a enumeração. Do jeito que tá sempre vai ser Feminino.


usuario.setSexo(SexoEnumeraton.valueOfCode(rs.getString(“sexo_usuario”)).getDescription());

Ou usando a enum na classe usuário, que fica melhor ainda.
usuario.setSexo(SexoEnumeraton.valueOfCode(rs.getString(“sexo_usuario”))); // Usuario.sexo é a enum SexoEnumeration