Listagem Mysql JDBC

11 respostas
E

Boa tarde pessoal!

Estou usando JDBC e banco Mysql
Então estou com dificuldade em resolver uma situação aqui:

Fazer uma listagem de eventos e candidatos que participam de cada evento.
Por exemplo:

------------------------//----------------------------------------------
evento 1
candidato1
candidato2
evento2
canididato3
candidato4
candidato5
.
.
.
----------------------//--------------------------------------------------

Sendo que possuo tres entidades: evento, candidato e evento_candidato(tabela de ligação)… alguem possui alguma idéia, ou tem algum tópico que discuta sobre isso?

Thanks

11 Respostas

drsmachado

Não entendi a dúvida.
1 - O que você já fez?
2 - Como está a tua query de consulta?
3 - Como está o método que faz a consulta?

E

Entao a seguinte query:

public List<Candidato> listarPorDia2() {
		try {
			
			
			List<Candidato> candidato = new ArrayList<Candidato>();
			
			[b]PreparedStatement stmt = this.connection.prepareStatement("SELECT * FROM candidatos, eventos, participante WHERE eventos.id_eve = participante.evento AND participante.candidato = candidatos.id_can;");[/b]
			
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()) {
				candidato.add(populaParticipanteCandidatos(rs));
			}
			
			rs.close();
			stmt.close();
			
			return candidato;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

---------------------------------------------------------------------------------//---------------------------
Onde participantes é a tabela de ligação evento_candidato.

Essa query passa pra uma Action:

@Action(value="listaDia", results={
		@Result(name="ok", location="listar-dia.jsp")
	})
	public String executedurp() {
		listaeve = new eventoDAO().listar();
		listacan = new ParticipanteDAO().listarPorDia2();
		
		return "ok";
	}

-----------------------------------------------------------------------------//------------------------------------------------------------------------
Onde eventoDAO().listar é um metodo de listagem de todos os eventos
e listarPorDia2 é o metodo acima…

Por fim temos o jsp:

<table cellpadding="2" id="rounded-corner">
		<tr>
			<th width="10">Processo</th>
			<th>Data</th>
			<th>Horário</th>
			<th colspan="2" align="center">Participantes</th>
			<th colspan="2" align="center">Opções</th>
		</tr>  
		<c:forEach items="${listaeve}" var="evento">
			<tr>
				<td class="alt" width="10"><a href="visualizaEvento?evento.id=${evento.id}">${evento.vaga}</a></td>
				<td><fmt:formatDate value="${evento.data.time}" pattern="dd/MM" /></td>
				<td><fmt:formatDate value="${evento.horario}" pattern="H:mm" /></td>
				<td><a href="javascript:popitup('listarParticipantes?evento.id=${evento.id}')">Visualizar</a></td>
				<td><a href="incluiParticipante?participante.id_evento=${evento.id}">Adicionar</a></td>
				<td><a href="mostraEvento?evento.id=${evento.id}">Alterar</a></td>
				<td><a href="javascript:confirma(${evento.id})">Remover</a></td>
				
			</tr>
					<c:forEach items="${listacan}" var="candidato">
					<tr>
						<td>${candidato.nome}</td>
					</tr>
					</c:forEach>
		</c:forEach>
	</table>

O que acontece é que ele lista todos os participantes em todos os eventos, repete os participantes agendados em todos os eventos…

drsmachado

Vamos fazer uma análise rápida.
Se você quer trazer todos os candidatos de todos os dias, essa tua query faz sentido.
Agora, se quer trazer todos os candidatos separados por dia, creio que esteja faltando algo.
Como assim?

SELECT * from A JOIN B ON A.id = B.a_id;

Traz tudo que existe em a e em B ao mesmo tempo.
Agora, se eu quero de uma data epecífica, faço:

SELECT * FROM A JOIN B ON A.id = B.a_id WHERE A.dt = '2012-09-03';

Isso me traz todos os registros de A que existem em B e cuja data seja igual à 03/09/2012.

Creio que você vá entender…

D

como está o relacionamento destas 3 entidades ?

faça um inner join

Exemplo

tabela usuario

id_usuario
nome
id_login

tabela login

id_login
login
senha

Query

select u.*,l.* from usuario u inner join login l on u.id_login = l.id_login

com isso trago toda as colunas do usuario e login

E

drsmachado essa era uma questão que iria resolver mais adiante, por enquanto quero mesmo apenas uma listagem geral, de todos os eventos…

dfnfilipe as tabelas estão assim (resumidamente):

Evento
-id_eve
-outros atributos

Candidato
-id_can
-outros atributos

Participante (tabela de ligação):
-evento (refere-se a id_eve)
-candidato (refere-se a id_can)

E

No caso se fizesse um inner join vc tem idéia de uma query que pudesse ler TODOS os EVENTOS, e para CADA EVENTO, listar SOMENTE seus CANDIDATOS?

Pois no momento, com essa query ele lê todos os candidatos agendados nos eventos, so que ele repete esses candidatos em todos os eventos. Por exemplo:

evento1
candidato1
candidato2
candidato3
evento2
candidato1
candidato2
candidato3
evento3
(repete novamente os mesmos candidatos)
.
.
.

drsmachado

Com este select
SELECT * FROM candidatos, eventos, participante WHERE eventos.id_eve = participante.evento AND participante.candidato = candidatos.id_can
Você não consegue filtrar de forma ideal
Você precisaria usar um group by, porém, não é o mais ideal.
Você terá que tratar isso no java, quebrando esse select em 2 e, dentro do while da consulta de eventos, fazer a busca pelos candidatos de cada um destes.

E

Entendi… pensei em fazer isso porém não entendi como fazer isso em um método.

Como ficaria o retorno desse método? Pois ele retorna um LIst de Candidatos, mas não de eventos…

tem como fazer ele retornar dois tipos diferentes de objetos? Ou to viajando muito?

drsmachado

Aí é que está.
Se você precisa identificar os eventos que um candidato participa, tem sentido colocar o retorno como uma lista de candidatos, cada qual contendo a lista de eventos em que estará presente.
Agora, se precisa encontrar os candidatos que cada evento terá, o ideal é retornar a lista de eventos, que possua uma lista de candidatos que estarão em cada evento.

Entendeu a diferença?

Não, não há como retornar mais de um tipo de objeto (a não ser que você não especifique o tipo de lista e, coloque como retorno apenas List ou List<?>)

E

entendi… no caso preciso de uma lista de eventos com cada candidato que participará, entao farei a segunda opção…

Vlw drsmachado, deu uma luz aqui, vou pensar melhor e amanha posto avanços =DD

E

Entao pessoal fiz o seguinte código:

public List<Evento> listarPorDia4() {
		try {
					
			List<Evento> eventos = new ArrayList<Evento>();
			List<Candidato> candidatos = new ArrayList<Candidato>();
			
			PreparedStatement stmt = this.connection.prepareStatement("SELECT * FROM eventos;");
			
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()) {
				
				PreparedStatement stmt2 = this.connection.prepareStatement("SELECT candidatos.* FROM candidatos, eventos, participante WHERE eventos.id_eve = participante.evento AND participante.candidato = candidatos.id_can;");
				
				ResultSet rs2 = stmt2.executeQuery();
				
				while (rs2.next()){
					
					candidatos.add(populaParticipanteCandidatos(rs));
				}
				
				rs2.close();
				stmt2.close();
			}
			
			rs.close();
			stmt.close();
			
			return eventos;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

Este código não compila… da erro na seguinte linha: eventos.add(populaParticipanteCandidatos(rs));

Este método serve para instanciar e popular candidatos, a partir de um result set…

Ainda não entendi como posso instanciar e popular Candidatos em uma classe que retorna um evento… e como passo estes candidatos como retorno?

Criado 3 de setembro de 2012
Ultima resposta 6 de set. de 2012
Respostas 11
Participantes 3