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?
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
endedan
Entao a seguinte query:
publicList<Candidato>listarPorDia2(){try{List<Candidato>candidato=newArrayList<Candidato>();[b]PreparedStatementstmt=this.connection.prepareStatement("SELECT * FROM candidatos, eventos, participante WHERE eventos.id_eve = participante.evento AND participante.candidato = candidatos.id_can;");[/b]ResultSetrs=stmt.executeQuery();while(rs.next()){candidato.add(populaParticipanteCandidatos(rs));}rs.close();stmt.close();returncandidato;}catch(SQLExceptione){thrownewRuntimeException(e);}}
---------------------------------------------------------------------------------//---------------------------
Onde participantes é a tabela de ligação evento_candidato.
-----------------------------------------------------------------------------//------------------------------------------------------------------------
Onde eventoDAO().listar é um metodo de listagem de todos os eventos
e listarPorDia2 é o metodo acima…
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
dfnfilipe
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
endedan
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
endedan
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:
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
endedan
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
endedan
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
endedan
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?