Resultados diferentes para o mesmo comando

Estou com um problema que estou precisando listar uma tabela, porém o comando que estou usando no workbench que no caso é:

SELECT Cerveja.nome, Vendas.quantidade, Vendas.data_venda
FROM Cerveja JOIN Vendas ON Vendas.chave = Cerveja.id WHERE Vendas.chave = 1;

Este no workbench retorna o resultado esperado;

aaa

Já no meu programa java mesmo usando o mesmo comando ele retorna a lista repetindo a última linha:

bbb

a função que estou utilizando é:

public static List<Vendas> Vendas(int id, List<Vendas> ListaVendas) {
	String sql = "SELECT Cerveja.nome, Vendas.quantidade, Vendas.data_venda\r\n" + 
		     "FROM Cerveja JOIN Vendas ON Vendas.chave = Cerveja.id WHERE Vendas.chave = ?;";
	Connection conn = Conexao.getConnection();
	try {
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet rs = ps.executeQuery(); 
		while (rs.next()) {
			ListaVendas.add(new Vendas(rs.getString("nome"), rs.getInt("quantidade"), rs.getString("data_venda")));
		}
		Conexao.Fechar_Conexao(conn, ps);
		return ListaVendas;
	} catch (SQLException e) {
		e.printStackTrace();
	}
	JOptionPane.showMessageDialog(null, "Error", "", JOptionPane.ERROR_MESSAGE);
	return null;
}

Como vc está montando a tabela no frame? Quando vc roda em modo debug, a lista ListaVendas está preenchida como?

Aparentemente não tem erro com o código, usei uns prints assim que termina de passar pelo while e parece que está recebendo assim mesmo do banco.

vou mandar o codigo do frame, assim fica melhor de entender:

public class Vendas_Escolha extends JFrame {

private static final long serialVersionUID = 1L;
protected static List<Vendas> vendas = new ArrayList<>();
private static int id = 1;

public static int getId() {
	return id;
}

public void setId(int id) {
	Vendas_Escolha.id = id;
}

public static void main(String[] args) {

	try {
		for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
			if ("Windows".equals(info.getName())) { // Para mudar o Design da interface
				javax.swing.UIManager.setLookAndFeel(info.getClassName());
				break;
			}
		}
	} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
			| javax.swing.UnsupportedLookAndFeelException ex) {
		System.err.println(ex);
	}

	Vendas_Escolha tela = new Vendas_Escolha();

	tela.setLocationRelativeTo(null);
	tela.setVisible(true);
}

private class PalletCellRenderer implements TableCellRenderer {

	private JLabel label = new JLabel();

	@Override
	public Component getTableCellRendererComponent(JTable table, Object conteudo, boolean selecionado,
			boolean focado, int lin, int col) {
		label.setText(String.valueOf(conteudo));

		label.setOpaque(false);
		switch (lin) {
		case 0:
			label.setHorizontalAlignment(SwingConstants.CENTER);
			break;
		case 1:
			label.setHorizontalAlignment(SwingConstants.CENTER);
			break;
		case 2:
			label.setHorizontalAlignment(SwingConstants.CENTER);
			break;
		}
		return label;
	}
}

public Vendas_Escolha() {
	super("Vendas");
	setResizable(false);
	addWindowListener(new WindowAdapter() {
		@Override
		public void windowClosing(WindowEvent arg0) {
			verify();
		}
	});
	setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
	setMinimumSize(new Dimension(390, 250));
	Vendas_Escolha.vendas = carregarPallets();
	JPanel panel = new JPanel();
	panel.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));

	JScrollPane scrollPane = new JScrollPane();
	scrollPane.setBounds(12, 13, 330, 139);

	JTable table_1 = new JTable(new Vendas_e_TableModel());
	table_1.setRowSelectionAllowed(false);
	table_1.setBounds(0, 0, 248, 154);
	table_1.setDefaultRenderer(Object.class, new PalletCellRenderer());
	table_1.getColumnModel().getColumn(0).setMaxWidth(100);
	table_1.getColumnModel().getColumn(1).setMaxWidth(80);
	table_1.getColumnModel().getColumn(2).setMaxWidth(150);

	scrollPane.setViewportView(table_1);

	JMenuBar menuBar = new JMenuBar();

	JMenu mnRetornar = new JMenu("Retornar");
	mnRetornar.addMouseListener(new MouseAdapter() {
		@Override
		public void mouseClicked(MouseEvent arg0) {
			verify();
		}
	});
	menuBar.add(mnRetornar);
	GroupLayout groupLayout = new GroupLayout(getContentPane());
	groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(Alignment.LEADING)
			.addGroup(groupLayout.createSequentialGroup().addGap(10)
					.addComponent(panel, GroupLayout.DEFAULT_SIZE, 304, Short.MAX_VALUE).addGap(10))
			.addComponent(menuBar, GroupLayout.DEFAULT_SIZE, 534, Short.MAX_VALUE));
	groupLayout.setVerticalGroup(groupLayout.createParallelGroup(Alignment.LEADING).addGroup(groupLayout
			.createSequentialGroup()
			.addComponent(menuBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
			.addGap(12).addComponent(panel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
			.addGap(16)));
	
	JMenu mnAddVenda = new JMenu("Add venda");
	menuBar.add(mnAddVenda);
	panel.setLayout(null);
	panel.add(scrollPane);
	getContentPane().setLayout(groupLayout);

}

public void verify() {
	Estoque_Visualization.contador = 0;
	Vendas_Escolha.this.dispose();
}

private List<Vendas> carregarPallets() {
	List<Vendas> pallets = new ArrayList<>();
	Teste_funcs.Vendas(getId(), pallets);
	return pallets;
}
}

class Vendas_e_TableModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;

// a Jtable chama esse método pra saber quantas colunas ela tem
@Override
public int getColumnCount() {
	return 3; // uma coluna pra ser o "cabeçalho" e mais uma coluna pra cada palet da lista
}

// a Jtable chama esse método pra saber quantas linhas ela tem
@Override
public int getRowCount() {
	return Vendas_Escolha.vendas.size(); // uma linha pra cada atributo do pallet exceto o ID, que será o
										 // cabeçalho
}

@Override
public String getColumnName(int column) {
	// TODO Auto-generated method stub
	switch (column) {
	case 0:
		return "Nome";
	case 1:
		return "Quantidade";
	case 2:
		return "Data da Venda";
	}
	return super.getColumnName(column);
}

// a Jtable chama esse método pra saber o valor a ser renderizado na linha e
// coluna informados
@Override
public Object getValueAt(int lin, int col) {
	switch (col) {
	case 0:
		return Vendas_Escolha.vendas.get(lin).getNome();
	case 1:
		return Vendas_Escolha.vendas.get(lin).getQuantidade();
	case 2:
		return Vendas_Escolha.vendas.get(lin).getData();
	}
	return null;
}

 }

Olá, pelo que vi no seu Frame seu getID() retorna seu id que é estatico ( sempre 1)

private static final long serialVersionUID = 1L;
protected static List vendas = new ArrayList<>();
private static int id = 1;

public static int getId() {
return id;
}

Sempre vai retornar o primeiro registro nao importa quantas iterações faça. Você tem que iterar o id pra trazer todos os registros.

Talvez eu tenha deixado implícito, me desculpe, minha tabela(SQL) tem 4 itens, id( de cada compra, achei desnecessário mas não consegui fazer sem ele), quantidade, data da venda e uma chave, o ponto principal é essa chave pois ela representa o id de cada cerveja, ou seja, quando a chave é igual 1, a cerveja é itaipava, se for igual a 2 é skol e assim por diante, quando eu faço a consulta pelo código eu quero pegar as vendas de uma cerveja específica por isso o id não muda, neste caso ele serve para representar um conjunto de linhas e não apenas uma, o id criado no frame, ele está fixo como 1 por ainda estar sendo testado, quando a função estiver funcionando corretamente o valor será passado de acordo com a preferência do usuário.
PS: E também ele não está retornando o primeiro registro e sim o último.

Posta o código de todas as classes envolvidas, creio que você esteja utilizando atributos estáticos onde não deveria.

public class Vendas { // aqui são os beans

private static int quantidade, SOMA_VENDAS;
private static String nome,data;

public Vendas(int Soma_vendas) {
	Vendas.setSOMA_VENDAS(Soma_vendas);
}

public Vendas(String nome, int quantidade,String data){
	Vendas.nome = nome;
	Vendas.quantidade = quantidade;
	Vendas.data = data;
}

public int getQuantidade() {
	return quantidade;
}
public static void setQuantidade(int quantidade) {
	Vendas.quantidade = quantidade;
}

public String getData() {
	return data;
}
public static void setData(String data) {
	Vendas.data = data;
}

public String getNome() {
	return nome;
}
public static void setNome(String nome) {
	Vendas.nome = nome;
}

public int getSOMA_VENDAS() {
	return SOMA_VENDAS;
}

public static void setSOMA_VENDAS(int sOMA_VENDAS) {
	SOMA_VENDAS = sOMA_VENDAS;
}

}

O frame:

public class Vendas_Escolha extends JFrame {

private static final long serialVersionUID = 1L;
protected static List<Vendas> vendas = new ArrayList<>();
private static int id = 1;

public static int getId() {
	return id;
}

public void setId(int id) {
	Vendas_Escolha.id = id;
}

public static void main(String[] args) {

	try {
		for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
			if ("Windows".equals(info.getName())) { // Para mudar o Design da interface
				javax.swing.UIManager.setLookAndFeel(info.getClassName());
				break;
			}
		}
	} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
			| javax.swing.UnsupportedLookAndFeelException ex) {
		System.err.println(ex);
	}

	Vendas_Escolha tela = new Vendas_Escolha();

	tela.setLocationRelativeTo(null);
	tela.setVisible(true);
}

private class PalletCellRenderer implements TableCellRenderer {

	private JLabel label = new JLabel();

	@Override
	public Component getTableCellRendererComponent(JTable table, Object conteudo, boolean selecionado,
			boolean focado, int lin, int col) {
		label.setText(String.valueOf(conteudo));

		label.setOpaque(false);
		switch (lin) {
		case 0:
			label.setHorizontalAlignment(SwingConstants.CENTER);
			break;
		case 1:
			label.setHorizontalAlignment(SwingConstants.CENTER);
			break;
		case 2:
			label.setHorizontalAlignment(SwingConstants.CENTER);
			break;
		}
		return label;
	}
}

public Vendas_Escolha() {
	super("Vendas");
	setResizable(false);
	addWindowListener(new WindowAdapter() {
		@Override
		public void windowClosing(WindowEvent arg0) {
			verify();
		}
	});
	setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
	setMinimumSize(new Dimension(390, 250));
	Vendas_Escolha.vendas = carregarPallets();
	JPanel panel = new JPanel();
	panel.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));

	JScrollPane scrollPane = new JScrollPane();
	scrollPane.setBounds(12, 13, 330, 139);

	JTable table_1 = new JTable(new Vendas_e_TableModel());
	table_1.setRowSelectionAllowed(false);
	table_1.setBounds(0, 0, 248, 154);
	table_1.setDefaultRenderer(Object.class, new PalletCellRenderer());
	table_1.getColumnModel().getColumn(0).setMaxWidth(100);
	table_1.getColumnModel().getColumn(1).setMaxWidth(80);
	table_1.getColumnModel().getColumn(2).setMaxWidth(150);

	scrollPane.setViewportView(table_1);

	JMenuBar menuBar = new JMenuBar();

	JMenu mnRetornar = new JMenu("Retornar");
	mnRetornar.addMouseListener(new MouseAdapter() {
		@Override
		public void mouseClicked(MouseEvent arg0) {
			verify();
		}
	});
	menuBar.add(mnRetornar);
	GroupLayout groupLayout = new GroupLayout(getContentPane());
	groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(Alignment.LEADING)
			.addGroup(groupLayout.createSequentialGroup().addGap(10)
					.addComponent(panel, GroupLayout.DEFAULT_SIZE, 304, Short.MAX_VALUE).addGap(10))
			.addComponent(menuBar, GroupLayout.DEFAULT_SIZE, 534, Short.MAX_VALUE));
	groupLayout.setVerticalGroup(groupLayout.createParallelGroup(Alignment.LEADING).addGroup(groupLayout
			.createSequentialGroup()
			.addComponent(menuBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
			.addGap(12).addComponent(panel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
			.addGap(16)));
	
	JMenu mnAddVenda = new JMenu("Add venda");
	menuBar.add(mnAddVenda);
	panel.setLayout(null);
	panel.add(scrollPane);
	getContentPane().setLayout(groupLayout);

}

public void verify() {
	Estoque_Visualization.contador = 0;
	Vendas_Escolha.this.dispose();
}

private List<Vendas> carregarPallets() {
	List<Vendas> pallets = new ArrayList<>();
	Teste_funcs.Vendas(getId(), pallets);
	return pallets;
}
}

class Vendas_e_TableModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;

// a Jtable chama esse método pra saber quantas colunas ela tem
@Override
public int getColumnCount() {
	return 3; // uma coluna pra ser o "cabeçalho" e mais uma coluna pra cada palet da lista
}

// a Jtable chama esse método pra saber quantas linhas ela tem
@Override
public int getRowCount() {
	return Vendas_Escolha.vendas.size(); // uma linha pra cada atributo do pallet exceto o ID, que será o
										 // cabeçalho
}

@Override
public String getColumnName(int column) {
	// TODO Auto-generated method stub
	switch (column) {
	case 0:
		return "Nome";
	case 1:
		return "Quantidade";
	case 2:
		return "Data da Venda";
	}
	return super.getColumnName(column);
}

// a Jtable chama esse método pra saber o valor a ser renderizado na linha e
// coluna informados
@Override
public Object getValueAt(int lin, int col) {
	switch (col) {
	case 0:
		return Vendas_Escolha.vendas.get(lin).getNome();
	case 1:
		return Vendas_Escolha.vendas.get(lin).getQuantidade();
	case 2:
		return Vendas_Escolha.vendas.get(lin).getData();
	}
	return null;
}
}

A função que entra em contato com o BD:

public static List<Vendas> Vendas(int id, List<Vendas> ListaVendas) {
	String sql = "SELECT Cerveja.nome, Vendas.quantidade, Vendas.data_venda\r\n" + 
		     "FROM Cerveja JOIN Vendas ON Vendas.chave = Cerveja.id WHERE Vendas.chave = ?;";
	Connection conn = Conexao.getConnection();
	try {
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet rs = ps.executeQuery(); 
		while (rs.next()) {
			ListaVendas.add(new Vendas(rs.getString("nome"), rs.getInt("quantidade"), rs.getString("data_venda")));
		}
		Conexao.Fechar_Conexao(conn, ps);
		return ListaVendas;
	} catch (SQLException e) {
		e.printStackTrace();
	}
	JOptionPane.showMessageDialog(null, "Error", "", JOptionPane.ERROR_MESSAGE);
	return null;
}

Fiz alguns testes e aparentemente, a lista está correta quando é impresso logo depois que é adicionado uma nova linha.

Porém quando o While é fechado por algum motivo todas as linhas são substituídas pela última,alguém tem alguma ideia do que seja ou por que está acontecendo? fica uma imagem para entender melhor:

Pelo que entendi, sua classe Vendas possui atributos estaticos(static):

public class Vendas { // aqui são os beans

    private static int quantidade, SOMA_VENDAS;
    private static String nome,data;

Quando você faz isso, você define que os valores atribuídos à qualquer um dos objetos dessa classe compartilharão desse valor. Então se você tem uma lista e dá um setQuantidade(10) em qualquer um dos objetos, todos os objetos terão a quantidade 10. Por isso que ao final da iteração seu objeto tem o valor do último registro lido, enquanto que no banco os valores são diferentes entre si.

Experimente remover o static, pelo menos dos atributos que são referidos na tabela, para confirmar minha teoria e diga se funcionou.

Consegui, era isso mesmo, valeu!