ArrayList ou Vector?

Boa tarde pessoal,

eu sei que Vector é mais antiga… e que arraylist é mais seguro e talz… talz…

porém eu estou me deparando com um problema, que por incrivel que pareça eu só consigo resolver com vector. Gostaria que vocês me ajudassem.

é o seguinte, eu crio um ArrayList<Object> e dentro dele, eu recebo um resultList de uma NativeQuery, conforme método abaixo:


public List<Object> listaDeBensPorNumNotaFiscal(int codNotaFiscal){
		
		List<Object> lista = new ArrayList<Object>();
		EntityManager manager = factory.createEntityManager();
	
		try{
		
		manager.getTransaction().begin();
		
		final Query query = manager
		.createNativeQuery("SELECT * , D.vl_Deprec  FROM financeiro.TBSIFN_NOTAFISCALBENS NFB," +
				" financeiro.TBSIFN_DEPRECIACAO D WHERE cd_NotaFiscal = " + codNotaFiscal + 
				"AND D.cd_Deprec = NFB.cd_Deprec ORDER BY cd_Inclusao");
		
lista =  query.getResultList();
		
		manager.getTransaction().commit();
		}catch (Exception e) {
			// TODO: handle exception
		}finally{
			if (manager != null) {
				manager.close();
			}
		}
		
		return lista;
		
	}

O problema de ela continuar como ArrayList de Object é que, quando eu tento retomar o valor que possui, da erro.
Por exemplo, o valor da posição 2, é do tipo Integer.
Quando eu tento fazer isso:


Integer teste = (Integer) lista.get(2);

ele não funciona, da erro de conversão e diz que o objeto do tipo Object não pode ser convertido para Integer.

E então eu pego e faço o seguinte.

percorro um vector e jogo o arraylist todo no vector, dae o resultado vem do jeito que eu quiser.

por exemplo:


if (this.notaFiscal.getCodNotaFiscal() != null) {
		
		for (Object notaFiscalBens : nfBensDao.listaDeBensPorNumNotaFiscal(this.notaFiscal.getCodNotaFiscal()) )
		{
			listaBens.add((Object[])notaFiscalBens);
			
		
		}

Ou seja, eu estou pegando o ArrayList<Object> e passando para listaBens que é do tipo Vector.

Alguém teria alguma solução para mim melhorar isso ?

Opa!

Por acaso o resultado do query.list() é uma array de array?

Vector ta praticamente deprecated…

Oi,

Só a utilização da List que está de forma errada.

Olha a diferença:

[code]ArrayList
list = new ArrayList();
list.add(1);

Integer
teste = (Integer)list.get(0);

System.out.println(teste);[/code]

Porque o exemplo acima não dá erro? :wink:

Tchauzin!

aqui está o result.


	List<Object> lista = new ArrayList<Object>();
		EntityManager manager = factory.createEntityManager();
	
		try{
		
		manager.getTransaction().begin();
		
		final Query query = manager
		.createNativeQuery("SELECT * , D.vl_Deprec  FROM financeiro.TBSIFN_NOTAFISCALBENS NFB," +
				" financeiro.TBSIFN_DEPRECIACAO D WHERE cd_NotaFiscal = " + codNotaFiscal + 
				"AND D.cd_Deprec = NFB.cd_Deprec ORDER BY cd_Inclusao");
		
lista =  query.getResultList();

é um ArrayList de Object.

[quote=lina]Oi,

Só a utilização da List que está de forma errada.

Olha a diferença:

[code]ArrayList
list = new ArrayList();
list.add(1);

Integer
teste = (Integer)list.get(0);

System.out.println(teste);[/code]

Porque o exemplo acima não dá erro? :wink:

Tchauzin![/quote]

A diferença é que vc está adicionando um inteiro, e não um objeto como eu estou fazendo. No seu caso, nem precisaria do Cast Integer, bastava o get(0) que ele iria trazer.

[quote=EuclidesFilizola][quote=lina]Oi,

Só a utilização da List que está de forma errada.

Olha a diferença:

[code]ArrayList
list = new ArrayList();
list.add(1);

Integer
teste = (Integer)list.get(0);

System.out.println(teste);[/code]

Porque o exemplo acima não dá erro? :wink:

Tchauzin![/quote]

A diferença é que vc está adicionando um inteiro, e não um objeto como eu estou fazendo. No seu caso, nem precisaria do Cast Integer, bastava o get(0) que ele iria trazer.[/quote]

Oi,

Não senhor… como defini que o meu ArrayList só aceitaria o tipo , o mesmo necessita de cast.

Provavelmente no seu caso, o get(2) não retorna um valor Integer.

Tchauzin!

Olha só … é provavel que teu query.list() esteja devolvendo um Array[][] .

  • Array[0][0] = coluna1A , coluna1B, coluna1C, …
  • Array[0][0] = coluna2A , coluna2B, coluna2C, …

ou seja… não tem como fazer o cast de Integer se vc somente fizer array[0].

Acredito que seja isso.

[quote=lina][quote=EuclidesFilizola][quote=lina]Oi,

Só a utilização da List que está de forma errada.

Olha a diferença:

[code]ArrayList
list = new ArrayList();
list.add(1);

Integer
teste = (Integer)list.get(0);

System.out.println(teste);[/code]

Porque o exemplo acima não dá erro? :wink:

Tchauzin![/quote]

A diferença é que vc está adicionando um inteiro, e não um objeto como eu estou fazendo. No seu caso, nem precisaria do Cast Integer, bastava o get(0) que ele iria trazer.[/quote]

Oi,

Não senhor… como defini que o meu ArrayList só aceitaria o tipo , o mesmo necessita de cast.

Provavelmente no seu caso, o get(2) não retorna um valor Integer.

Tchauzin![/quote]

Foi mal, eu me precipitei. Eu quis dizer que há uma diferença. Nesse caso ae, você já seta um tipo primitivo “1”. No meu caso, é uma lista que dentro dela há vários tipos, há Integer, Date, String … etc …

o meu problema é que, se eu tentar converter a lista.get(x) para o tipo correto dela, não funciona !

só para ter uma ideia, se eu fizer um System.Out.Println(lista.get(2).class) e pegar o tipo dessa classe e tentar fazer um cast, ele não vai funcionar. !

vocês estão me entendendo. ?

vocês estão entendendo. ?

[code]public static void main(String[] args) {

	List<Object> lista = new ArrayList<Object>();
	EntityManager manager = factory.createEntityManager();

	try {

		manager.getTransaction().begin();

		final Query query = manager
				.createNativeQuery("SELECT * , D.vl_Deprec  FROM financeiro.TBSIFN_NOTAFISCALBENS NFB,"
						+ " financeiro.TBSIFN_DEPRECIACAO D WHERE cd_NotaFiscal = "
						+ codNotaFiscal
						+ "AND D.cd_Deprec = NFB.cd_Deprec ORDER BY cd_Inclusao");

		/* este metodo getResultList() está, provavelemente, te devolvendo um array, 
		 * já que o "select *, D.vl_Deprec", apontam pelo menos 2 campos. Se tiver 
		 * mais de uma linha de rsposta logo terá uma array de array.
		 * 
		 *  lista[o] = {coluna0A, coluna0B}
		 *  lista[1] = {coluna1A, coluna1B}
		 *  lista[2] = {coluna2A, coluna2B}
		 *  assim por diante.......
		 *  
		 * */ 
		lista = query.getResultList();

		manager.getTransaction().commit();
	} catch (Exception e) {
		// TODO: handle exception  TEM ALGUM PRINT AQUI ? ahsuhaushausa, é cheio disso em alguns códigos legados que eu pego
	} finally {
		if (manager != null) {
			manager.close();
		}
	}
	
	
	/* caso esteja retornando um array de array mesmo a linha abaixo irá disparar um CastClassException*/
	Integer teste = (Integer) lista.get(2); 
	
	/*Deveria ser assim, mais ou menos*/
	List<Object> listaSimples = (List<Object>) lista.get(2);
	
	Integer teste1 = (Integer)listaSimples.get(indiceDeOndeTeraUmInteger);

}

[/code]

Era mais ou menos isso que eu estava querendo dizer… só não posso afirmar pois não sei resultado do SQL. :smiley:

Sim…

e entao tem alguma ideia pra me ajudar ? O problema é que meu select traz mais de 1 entidade, por isso que eu faço um array de <Object>. e utilizo uma nativeQuery.

… alguem tem ideia pra me ajudar ?

[quote=EuclidesFilizola]Sim…

e entao tem alguma ideia pra me ajudar ? O problema é que meu select traz mais de 1 entidade, por isso que eu faço um array de <Object>. e utilizo uma nativeQuery.

… alguem tem ideia pra me ajudar ?[/quote]

O problema é que vc confundiu todo o mundo quando falou em Vector, quanto na realidade vc não está usando Vector e sim array. (Em java, não se usa a palavra “vector” para se referir a arrays porque Vector é uma classe java)

listaBens.add((Object[])notaFiscalBens);  

O problema é que o seu objecto é um array e vc quer colocá-lo num List.

O que vc pode fazer muito mais facilmente assim

listaBens =  Arrays.asList(notaFiscalBens);  

quando vc executa sua query vc revebe um List de array de Object ( Ou seja List<Object[]> )

Para trabalhar com isso e recuperar o campo 3 da linha 2 vc faz

        Integer teste = (Integer) lista.get(2)[3];  // repare que um é () e o outro é []

contudo, o seu problema é no uso do hibernate. Vc deve declarar um objeto de relatorio de forma que o hibernate popule esse objeto. ai vc terá uma lista de objetos , que é muito mais simples de tratar que uma lista de array.

Só uma observação entre Vector e ArrayList…

ArrayList não é uma versão mais nova e segura de Vector…

A diferença entre Vector e ArrayList é que Vector é synchronized e ArrayList não é synchronized…

Dependendo da situação você precisará usar Vector (quando tiver várias threads usando o mesmo objeto por exemplo) (que nao é o caso)

[quote=rogelgarcia]Só uma observação entre Vector e ArrayList…

ArrayList não é uma versão mais nova e segura de Vector…

A diferença entre Vector e ArrayList é que Vector é synchronized e ArrayList não é synchronized…

Dependendo da situação você precisará usar Vector (quando tiver várias threads usando o mesmo objeto por exemplo) (que nao é o caso)

[/quote]

Bom dia garcia,

então você teria alguma idéia para me ajudar ? algo para me dar uma força ?

[quote=EuclidesFilizola][quote=rogelgarcia]Só uma observação entre Vector e ArrayList…

ArrayList não é uma versão mais nova e segura de Vector…

A diferença entre Vector e ArrayList é que Vector é synchronized e ArrayList não é synchronized…

Dependendo da situação você precisará usar Vector (quando tiver várias threads usando o mesmo objeto por exemplo) (que nao é o caso)

[/quote]

Bom dia garcia,

então você teria alguma idéia para me ajudar ? algo para me dar uma força ? [/quote]

Não li tudo que o pessoal falou … mas na sua pergunta:

Integer teste = (Integer) lista.get(2); 

O valor da posição 2 não é integer…

Acho que deve ser Object[]…

Então voce teria que fazer (Integer) ((Object[])lista.get(1))[2]…

Lembre-se que o resultado de uma query é uma lista de listas…

1 -> [campo1, campo2, campo3, campo4]
2 -> [campo1, campo2, campo3, campo4]
3 -> [campo1, campo2, campo3, campo4]
4 -> [campo1, campo2, campo3, campo4]
5 -> [campo1, campo2, campo3, campo4]

Se vc quiser pegar o campo em negrito por exemplo… o código seria:

Object[] linha2 = (Object[])lista.get(2); //pegar o segundo resultado Object o = linha2[2];// pega o tericeiro item.. lembre-se que o array começa em zero.. então o terceiro item é com indice 2

Depois vc faz o cast do objeto para o tipo correto
Aprenda a usar o debug… vai ajudar…