Problemas com List

opa pessoal… td bom??

eu to com um problema que não consigo resolver…

eu tenho que listar alguns pedidos de acordo com o q o usuario queira…

pra isso criei um bean chamado pedido com slguns objetos q eu tb criei beans deles…

a estrutura ficou assim :

PEDIDO
    - HEADER
        alguns fields Strings aki
    - ITEM
        alguns fields Strings aki
    - RATEIO
        alguns fields Strings aki
    - TEXTO
        alguns fields Strings aki

eu efetuo a pesquisa e varro o resultSet preenchendo um objeto Pedido e depois coloco em uma List… está rodando sem erros…

mas cada vez q eu vou pegar o registro seguinte e adiciono na List, os registros anteriores ficam iguais…

alguém pode me ajudar ae??

....
List<PedidoBean> pedidoList = new ArrayList<PedidoBean>();
Connection conn = ConnectionFactory.getConexao();

PreparedStatement stmt = conn.prepareStatement(sqldao.getQueryPedidos());
ResultSet rs = stmt.executeQuery();

while (rs.next()) {
	PedidoBean pedido = new PedidoBean();

	// seta header
	pedido.setHeader(new HeaderBean());  // parametros do header sao todos fixos

	// seta item
	ItemDao itemdao = new ItemDao();
	pedido.setItem(itemdao.getItem(rs));

	// seta rateio
	RateioDao rateiodao = new RateioDao();
	pedido.setRateio(rateiodao.getRateio(rs));

	// seta texto
	TextoBean texto = new TextoBean();
	texto.setConteudo("teste");
	pedido.setTexto(texto);

	pedidoList.add(pedido);
}
.....

:shock:

provavelmente é algum erro bobo ou detalhe q eu não estou vendo…

alguém??

:cry:

Olá,

Em qual momento no seu código você está passando para o próximo elemento do seu ResultSet? Não vi nada nesse trecho que você postou. Pode ser que esteja aí o problema, pois ele está pegando sempre o mesmo elemento.

[]´s
Tatiana

ele está passando por todos os elementos sim… pois eu dei um system.out.println nos dados antes de adicionar ao list… e está batendo com os dados q eu puxei do banco…
ele está mudando de posição quando eu dou um rs.next() na condição do looping…

está parecendo q ele continua mantendo a referência aos objetos… pois todos mudam juntos e de acordo com os dados do ultimo adicionado a lista…

Olá,

Foi mal! To literalmente dormindo aqui :stuck_out_tongue:

Bom, experimente trocar os parâmetros de entrada dos métodos DAO: itemdao.getItem e rateiodao.getRateio para os tipos concretos realmente utilizados na cláusula WHERE; como por exemplo, String, Integer, Double, etc.

Você não deve passar o ResultSet como parâmetro para outros métodos de outras classes, porque isso pode acarretar problemas como travamento da conexão com o BD. Via de regra, o ResultSet deve ser utilizado no menor escopo possível.

[]´s
Tatiana

hehehe… sussa…

itemdao.getItem e rateiodao.getRateio são metodos q capturam os dados do resultSet e jogam no meu objeto… ficaria muita coisa no loop… ai eu separei o código… vou tentar colocar tudo junto…

continua a mesma coisa…

mudar isso só complicou mais a visualização… e ficou fora de padrão…

valeww Tatiana :slight_smile: … mas infelizmente não funcionou… :cry:

tente isso:

while (rs.next()) {
 	PedidoBean pedido = new PedidoBean();
 
 	// seta header
 	pedido.setHeader(new HeaderBean());  // parametros do header sao todos fixos
 
 	// seta item
 	ItemDao itemdao = new ItemDao();
 	pedido.setItem(itemdao.getItem(rs));
 
 	// seta rateio
 	RateioDao rateiodao = new RateioDao();
 	pedido.setRateio(rateiodao.getRateio(rs));
 
 	// seta texto
 	TextoBean texto = new TextoBean();
 	texto.setConteudo("teste");
 	pedido.setTexto(texto);
 
 	pedidoList.add(pedido);

        pedido = null; <<-------------------- AQUI --------------------------
 }

opa Luiz… blz?

então… eu tentei setar null pra ele, mas não adiantou nada…

até tentei usar o synchrinized… mas não obtive sucesso…

já não sei mais o q fazer… estou há 1 dia e meio tentando resolver isso…

:frowning:

putz… q coisa !!!
era pra estar funcionando…
tenta declarar o PedidoBean fora do while… e dentro do while só crie a nova instância.

abaixo um exemplo de como ficaria (e mais algumas dicas, se me permite):


PedidoBean pedido = null;

// eu acredito que você só precise criar uma isnstância das DAOs, antes do while
ItemDao itemdao = new ItemDao();
RateioDao rateiodao = new RateioDao();

while (rs.next()) {

  	pedido = new PedidoBean();
  
  	// seta header
  	pedido.setHeader(new HeaderBean());  // parametros do header sao todos fixos
  
  	// seta item  	
  	pedido.setItem(itemdao.getItem(rs));
  
  	// seta rateio  	
  	pedido.setRateio(rateiodao.getRateio(rs));
  
  	// seta texto
  	TextoBean texto = new TextoBean();
  	texto.setConteudo("teste");
  	pedido.setTexto(texto);
  
  	pedidoList.add(pedido);
 
        pedido = null; <<-------------------- AQUI --------------------------
  }

do mais tá tudo certo, era pra estar funcionando…

tenta aí e vamos tentando arrumar o trem :smiley:

pois é…hehehhe essa doidera viu!! :stuck_out_tongue:
depois o pessoal não sabe pq q programador envelhece mais cedo hehehehe

opa… claro q permito… ajuda é sempre bem vinda…

eu acho q o problema não é na List pq eu tentei com Set e com array e em todos ele muda…

eu vou tentar agora as dicas q vc passou… já já eu posto…
tomara q seja isso…

:wink:

não funcionou… :cry:

ele mantem o mesmo comportamento quando eu to debugando…

ele atualiza todos os registros da list e do array…

toda vez q ele adiciona um outro elemento ele muda em todos os existentes…


eu tentei setar null para todos beans no final do looping tb e instancia-los de novo no começo do looping… mas sem sucesso…

ahhhhhhhhhhhh

eu achei que o objeto repetido era o PedidoBean, mas não é :smiley:
o PedidoBean está sendo mudado, só o objeto RateioBean que não.

pode Mandar o código da classe RateioDao (ou pelo menos do método rateiodao.getRateio(rs))?

vamos achar essa solução já já!!

[]'s

Aliás, ItemBean tb tá dando pau…

eis o trecho problemático… made as classes ou métodos se puder!

// seta item  	
   	pedido.setItem(itemdao.getItem(rs));
   
   	// seta rateio  	
   	pedido.setRateio(rateiodao.getRateio(rs));

vc quer o codigo só do metodo q efetua o preenchimento da list ou dos beans tb??

creio q dos Beans não precisa não
só os métodos das DAOs… por enquanto :smiley:
se o problema estiver fora dos métodos aí eu te peço o código da classe.

[]'s

public class PedidoDAO {

	public PedidoBean getPedido (Filtro filtro) {
		PedidoBean pedido = new PedidoBean();
		return pedido;
	}

	public List<PedidoBean> getList(Filtro filtro) throws SQLException, ParseException {
		List<PedidoBean> pedidoList = new ArrayList<PedidoBean>();
		
		PedidoBean [] pedids = null;
		pedids = new PedidoBean [10];  // setei 10 para testar somente... sao muito mais registros q vem do banco

		SqlDao sqldao= new SqlDao();

		Connection conn = ConnectionFactory.getConexao();

		sqldao.setFiltro(filtro);  // dados fornecidos pelo usuario para efetuar a pesquisa
		PreparedStatement stmt = conn.prepareStatement(sqldao.getQueryPedidos());
		ResultSet rs = stmt.executeQuery();

		PedidoBean pedido = null;
		ItemDao itemdao = null;
		RateioDao rateiodao = null;
		TextoBean texto = null;

		int chave = 0;
		synchronized (this) {  // mesmo sincronizando nao mudou nada...
			while (rs.next()) {
				pedido = new PedidoBean();
				itemdao = new ItemDao();
				rateiodao = new RateioDao();
				texto = new TextoBean();

				// seta header
				pedido.setHeader(new HeaderBean());  // parametros do header sao todos fixos

				// seta item
				//ItemDao itemdao = new ItemDao();
				pedido.setItem(itemdao.getItem(rs));

				// seta rateio
				//RateioDao rateiodao = new RateioDao();
				pedido.setRateio(rateiodao.getRateio(rs));

				// seta texto
				//TextoBean texto = new TextoBean();
				texto.setConteudo("teste");
				pedido.setTexto(texto);

				// Ambos ocorre o mesmo comportamento
				pedids[chave] = pedido;    // teste com Array		
				chave++;
				pedidoList.add(pedido);    // teste com List				

				pedido = null;
				itemdao = null;
				rateiodao = null;
				texto = null;
			}
		}
		if (rs != null) {
			rs.close();
			rs = null;
		}
		if (stmt != null) {
			stmt.close();
			stmt = null;
		}
		if (conn != null) {
			ConnectionFactory.ReleaseConnection(conn);
			conn = null;
		}
		
		return pedidoList;  // retorna lista com todos os pedidos...
	}
}
public class PedidoBean {
	private HeaderBean header;
	private ItemBean item;
	private RateioBean rateio;
	private TextoBean texto;
	
	// getters e setters

}
public class HeaderBean {
	private String header = "H";              // fixo
	private String fornecedor = "3489";       // fixo
	private String grupoCompras = "OC01";     // fixo
	private String grupoCompradores = "902";  // fixo
	private String empresa = "AZB";           // fixo

	// getters e setters
}
public class ItemBean {
	private String item = "I";                // fixo
	private String texto = "Passagem aérea";  // fixo
	private String quantidade = "1";          // fixo
	private String dataRemessa = null;
	private Double preco = null;
	private String grupoMercadorias = "32";   // fixo
	private String centro = "CE01";           // fixo
	private String contrato = "4600000305";   // fixo
	private String linha = "10";              // fixo

	// getters e setters
}
public class RateioBean {

	private String rateio = "R";             // fixo
	private String porcentagem = null;
	private String centroCusto = null;
	private String contaRazao = "56121507";  // fixo
	private String ordem = null;
	private String elementoPEP = null;
	private String localDescarga = "SFV";    // fixo
	private String recebedor = "Cristiane";  // fixo

	// getters e setters
}
public class TextoBean {
	private String texto = "T";
	private String conteudo = null;

	// getters e setters
}
public class ItemDao {
	private static ItemBean item = new ItemBean();

	public ItemBean getItem(ResultSet rs) throws SQLException, ParseException {
		// setando date da remessa
		//item.setDataRemessa(Conversores.parseToCalendar(rs.getString("DATEMI")));
		item.setDataRemessa(rs.getString("DATEMI"));
		// setando o total
		Double taxa = rs.getDouble("TAXA");
		Double tarifa = rs.getDouble("TARIFA");
		Double desconto = rs.getDouble("DESCONTO");
		Double preco = taxa + tarifa - desconto;
		item.setPreco(preco);

		return this.item;
	}
}
public class RateioDao {
	private static RateioBean rateio = new RateioBean();

	public RateioBean getRateio(ResultSet rs) throws SQLException, ParseException {
		rateio.setPorcentagem("100");
		rateio.setCentroCusto(rs.getString("CENTROC"));
		rateio.setOrdem(rs.getString("CODET3"));
		rateio.setElementoPEP(rs.getString("CODET2"));

		return this.rateio;
	}
}