Transformar Oracle tipo Date em Java Calendar

Olá senhores,
estou fazendo os exercícios da apostila fj21 da caelum. Só que dessa vez resolvi implentar todos os códigos com o bd Oracle no lugar no MySQL. para variar um pouquinho.
Lembrando que os exercícios de teste de conexão e inserção de dados no Oracle, estão funcionando.
Mas para recuperar os dados tenho erro quando tento recuperar campos Date e convertê-los em Calendar. Com instruções sql recupero todos os outros campos.
Com o MySQL todos os códigos funcionam, então não sei o q fazer.
a estrutura da tabela no mysql e no oracle é:

         create table contatos (
                 id number NOT NULL,
                 nome VARCHAR(20),
                email VARCHAR(20),
                endereco VARCHAR(20),
                dataNascimento DATE,
                 primary key (id)
            );

e tenho o seguinte método:

public List<Contato> getLista() {
		try {
			List<Contato> contatos = new ArrayList<Contato>();
			PreparedStatement stmt = this.conn.prepareStatement("select * from contatos");
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				// criando o objeto Contato
				Contato contato = new Contato();
				contato.setId(rs.getLong("id"));
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));

				 // montando a data através do Calendar
				 Calendar data = Calendar.getInstance();
				 data.setTime(rs.getDate("dataNascimento"));
				 contato.setDataNascimento(data);

				// adicionando o objeto à lista
				contatos.add(contato);
			}
			rs.close();
			stmt.close();
			return contatos;
		} catch (SQLException e) {
			throw new DAOException(e);
		}
	}

Aqui eu tenh o erro:

Calendar data = Calendar.getInstance();
data.setTime(rs.getDate(“dataNascimento”));
contato.setDataNascimento(data);

E pq vc quer usar Calendar no atributo? geralmente se usa Date

1 curtida

Primeiro, essa forma já esta ultrapassada, o correto seria usar o Java.Time.*;
Dessa forma:

DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; // Verificar o formato
LocalDate ld = LocalDate.parse((rs.getString(1)), formatter);

E sua sugestão seria buscar a data como string do banco e fazer parse só pra usar o tipo novo?

1 curtida

buscar como string foi só a forma que eu achei mais fácil, pois, inclusive usando date eu transformava em string.
hoje eu uso string tanto para buscar quanto para adicionar, porem no meu banco esta classificado como date.
(em termos de processo da na mesma string e date na requisição)

Não sei se está tão ultrapassado, pois é as apostilas da caelum sempre são bem atualizadas.
Mas de qualquer forma eu agradeço.
Só não entendi porque no MySQL funciona e no Oracle não.

Exception in thread “main” java.lang.IllegalArgumentException
at java.sql.Time.valueOf(Unknown Source)
at oracle.jdbc.driver.CharCommonAccessor.getTime(CharCommonAccessor.java:435)
at oracle.jdbc.driver.OracleResultSetImpl.getTime(OracleResultSetImpl.java:772)
at oracle.jdbc.driver.OracleResultSet.getTime(OracleResultSet.java:1649)
at br.com.oracle.jdbc.dao.ContatoDao.getLista(ContatoDao.java:58)
at br.com.oracle.jdbc.teste.TestaLista.main(TestaLista.java:15)
sempre tenho esse erro

qual versão do java e do conector jdbc que está usando?

Calendar data = Calendar.getInstance();
String get = rs.getString(“dataNascimento”);
long date = Date.parse(get);
data.setTimeInMillis(date);
contato.setDataNascimento(data);

Minha gambiarra convertendo pra String primeiro ficou assim, mas não acho que isso seja uma boa prática. por favor, façam algo mais resumido.

1 curtida
Calendar data = Calendar.getInstance();
data.setTimeInMillis(Date.parse(rs.getString(“dataNascimento”)));
contato.setDataNascimento(data);

assim?

to usando o java 1.8.0_181
driver oracle ojdbc14-10.2.0.4.0.jar
Uso o eclipse e oracle 10g.

hahahaha, isso aí não vale.
Mas tá funcionando, sera que é o driver do oracle?

primeiro gostaria de dizer que a classe calendar ainda pode ser usada, eu só me confundi com uma outra antiga, segunda coisa é que essa é a forma mais “eficaz” que eu conheço e terceiro, você pode usar a classe date do próprio jdbc para não fazer essa transição toda.

Não posso mecher nos atributos(mudar de Calendar para Date), tem que ficar Calendar mesmo, porque podera comprometer outros exercícios. Como ficaria usando a propria classe date? Não entendi.

é a classe do objeto retornado por: rs.getDate(“dataNascimento”), mas como disse, você teria que mudar o projeto. E talvez esse deva ser o erro, o método rs.getDate() do mysql deve retornar calendar enquanto o Oracle retorna um Date!

Não é não.
quando executo getDate(“dataNascimento”) sem atribuir a variavel alguma ou usar no Calendar.setTime, o erro ocorre. só funciona o método getString. Aí converto para date e depois seto no Calendar. Ou seja tenho que converter pra String primeiro, porque getDate da erro.
No mySQL eu uso o getDate e depois Calendar data … data.setTime(o resultado de getDate. Ele devolve Date mesmo.

1 curtida

entendi…

Independente de qual SGBD você está usando, o que vai contar é como a API do JDBC foi implementada pelo driver especificado para a conexão.
Assim sendo, você vai, para campos do tipo DATE, usar o método getDate da interface ResultSet. Este método devolve um objeto de java.sql.Date.
Esta classe estende a classe java.util.Date, logo, ela herda todos os métodos públicos desta classe, incluindo, o método getTime(), que devolve um long representando a data especificada.

Logo, esqueça o getString e use o getTime, assim

Calendar dataBd = Calendar.getInstance();
dataBd.setTime(rs.getDate("coluna_com_a_data"));
//ou
data.setTimeInMillis(rs.getDate("coluna_com_a_data").getTime());

Uma dessas opções pode resolver.
Porém, seria mais indicado tentar usar as novas opções oferecidas pela API de datas do java, nas versões 8 e superiores.

Na primeira forma ocorre o erro:

Calendar dataBd = Calendar.getInstance();
				dataBd.setTime(rs.getDate("dataNascimento"));

Exception in thread “main” java.lang.IllegalArgumentException
at java.sql.Date.valueOf(Unknown Source)
at oracle.jdbc.driver.CharCommonAccessor.getDate(CharCommonAccessor.java:410)
at oracle.jdbc.driver.OracleResultSetImpl.getDate(OracleResultSetImpl.java:743)
at oracle.jdbc.driver.OracleResultSet.getDate(OracleResultSet.java:1637)
at br.com.oracle.jdbc.dao.ContatoDao.getLista(ContatoDao.java:62)
at br.com.oracle.jdbc.teste.TestaLista.main(TestaLista.java:15)

na segunda forma:

Calendar dataBd = Calendar.getInstance();
				dataBd.setTimeInMillis(rs.getDate("dataNascimento").getTime());

Exception in thread “main” java.lang.IllegalArgumentException
at java.sql.Date.valueOf(Unknown Source)
at oracle.jdbc.driver.CharCommonAccessor.getDate(CharCommonAccessor.java:410)
at oracle.jdbc.driver.OracleResultSetImpl.getDate(OracleResultSetImpl.java:743)
at oracle.jdbc.driver.OracleResultSet.getDate(OracleResultSet.java:1637)
at br.com.oracle.jdbc.dao.ContatoDao.getLista(ContatoDao.java:62)
at br.com.oracle.jdbc.teste.TestaLista.main(TestaLista.java:15)

mesmo erro.

já tinha tentato isso, por enquanto só convertendo pra String:

 Calendar data = Calendar.getInstance(); 
				 String get = rs.getString("dataNascimento");
				 long date = Date.parse(get);
				 data.setTimeInMillis(date);
				 contato.setDataNascimento(data);

Estou muito animado com a comunidade, me sinto em casa agora. Obrigado por ajudarem!

1 curtida

Provavelmente você não esteja usandoo javax.sql.ResultSet e, por conta disso, recebe esta exception.

1 curtida