Listas

28 respostas
simberg

O que tem de errado nesse código?

Estou tentando colocar uma lista dentro da outra.

public List<Contato>getLista_cc ()  throws SQLException{
		PreparedStatement stmt= this.connection.prepareStatement("SELECT local.descricao, defesa.prof1, defesa.prof2, defesa.prof3, defesa.prof4, defesa.numero, defesa.data, defesa.horario, candidatos.nome_aluno, candidatos.titulo, candidatos.tipo, professores.nome_professor FROM local INNER JOIN (professores INNER JOIN (candidatos INNER JOIN defesa ON candidatos.idc = defesa.candidato) ON professores.idp = candidatos.orientador) ON local.idl = defesa.local order by defesa.data;");
		ResultSet rs=stmt.executeQuery();

//Segunda Consulta que quero acessar

		PreparedStatement stmt1= this.connection.prepareStatement("SELECT defesa.prof1, defesa.numero, professores.nome_professor FROM defesa INNER JOIN professores ON professores.idp = defesa.prof1");
		ResultSet rs1=stmt1.executeQuery();


		ArrayList<Contato>list_cc = new ArrayList<Contato>();
		while(rs.next()){
				
				Contato c1=new Contato();
				numerox=rs.getInt("numero");
				c1.setNumero(rs.getInt("numero"));	
				c1.setData(rs.getDate("data"));
				c1.setHorario(rs.getTime("horario"));
				c1.setNome_aluno(rs.getString("nome_aluno"));
				c1.setTitulo(rs.getString("titulo"));
				c1.setTipo(rs.getBoolean("tipo"));
				c1.setNome_professor(rs.getString("nome_professor"));
				c1.setDescricao(rs.getString("descricao"));
				c1.setProf1(rs.getInt("prof1"));
				c1.setProf2(rs.getInt("prof2"));
				c1.setProf3(rs.getInt("prof3"));
				c1.setProf4(rs.getInt("prof4"));
				list_cc.add(c1);
			
				}

//Novo looping, sem ele funciona, mas não acesso a informação que quero que é o nome do Prof1.


		while(rs1.next()){
			
			ContatoProfessores c=new ContatoProfessores();
			c.setNome_professor(rs.getString("nome_professor"));
			list_cc.add(c);
		}
			
		rs.close();
		rs1.close();
		stmt.close();
		stmt1.close();
		return list_cc;
	}

Testei o SQL dentro do Postgree e deu certo.
Mas, quando vai para a página, dá isso:


HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.jsp.el.ELException: An error occurred while getting property “lista_cc” from an instance of class br.direito.defesas.dao.ContatoDAO

org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:844)

org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)

org.apache.jsp.rel_005fbancas_jsp._jspService(org.apache.jsp.rel_005fbancas_jsp:203)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

org.postgresql.util.PSQLException: ResultSet não está posicionado corretamente, talvez você precise chamar next.
org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkResultSet(AbstractJdbc2ResultSet.java:2451)
org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:1882)
org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:2184)
br.direito.defesas.dao.ContatoDAO.getLista_cc(ContatoDAO.java:157)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.apache.commons.el.ArraySuffix.evaluate(ArraySuffix.java:314)
org.apache.commons.el.ComplexValue.evaluate(ComplexValue.java:145)
org.apache.commons.el.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluatorImpl.java:263)
org.apache.commons.el.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluatorImpl.java:190)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:922)
org.apache.jsp.rel_005fbancas_jsp._jspx_meth_c_forEach_0(org.apache.jsp.rel_005fbancas_jsp:219)
org.apache.jsp.rel_005fbancas_jsp._jspService(org.apache.jsp.rel_005fbancas_jsp:185)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Como faço essa outra lista, dentro da primeira?

Agradeço qualquer ajuda.

28 Respostas

abelgomes

gafanhoto…no primeiro while(rs.next) vc vai ate o final do resultset…e logo depois faz outro while(rs.next) como ele esta no final…vai dar erro org.postgresql.util.PSQLException: ResultSet não está posicionado corretamente, talvez você precise chamar next.

entao antes de while vc faz rs.first que vai dar certo :wink:

ha separa tb o nome do metodo que esta assim public ListgetLista_cc

para ficar assim public List getLista_cc
só por…

simberg

Caro Mestre,

Obrigado pela atenção e resposta.

Porém o gafanhoto aqui, tá fazendo bobagem.

public List<Contato> getLista_cc ()  throws SQLException{
		PreparedStatement stmt= this.connection.prepareStatement("SELECT local.descricao, defesa.prof1, defesa.prof2, defesa.prof3, defesa.prof4, defesa.numero, defesa.data, defesa.horario, candidatos.nome_aluno, candidatos.titulo, candidatos.tipo, professores.nome_professor FROM local INNER JOIN (professores INNER JOIN (candidatos INNER JOIN defesa ON candidatos.idc = defesa.candidato) ON professores.idp = candidatos.orientador) ON local.idl = defesa.local order by defesa.data;");
		ResultSet rs=stmt.executeQuery();
		PreparedStatement stmt1= this.connection.prepareStatement("SELECT defesa.prof1, defesa.numero, professores.nome_professor FROM defesa INNER JOIN professores ON professores.idp = defesa.prof1");
		ResultSet rs1=stmt1.executeQuery();
		ArrayList<Contato>list_cc = new ArrayList<Contato>();
		while(rs.next()){
				
				Contato c1=new Contato();
				numerox=rs.getInt("numero");
				c1.setNumero(rs.getInt("numero"));	
				c1.setData(rs.getDate("data"));
				c1.setHorario(rs.getTime("horario"));
				c1.setNome_aluno(rs.getString("nome_aluno"));
				c1.setTitulo(rs.getString("titulo"));
				c1.setTipo(rs.getBoolean("tipo"));
				c1.setNome_professor(rs.getString("nome_professor"));
				c1.setDescricao(rs.getString("descricao"));
				c1.setProf1(rs.getInt("prof1"));
				c1.setProf2(rs.getInt("prof2"));
				c1.setProf3(rs.getInt("prof3"));
				c1.setProf4(rs.getInt("prof4"));
				list_cc.add(c1);
				
				if(rs.first()){	
				
					while(rs1.next()){
						
						ContatoProfessores c=new ContatoProfessores();
						c.setNome_professor(rs.getString("nome_professor"));
						list_cc.add(c);
					}
				}
		}
		rs.close();
		rs1.close();
		stmt.close();
		stmt1.close();
		return list_cc;
	}

Dá o seguinte erro:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.jsp.el.ELException: An error occurred while getting property “lista_cc” from an instance of class br.direito.defesas.dao.ContatoDAO

org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:844)

org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)

org.apache.jsp.rel_005fbancas_jsp._jspService(org.apache.jsp.rel_005fbancas_jsp:203)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

org.postgresql.util.PSQLException: Operação requer um ResultSet rolável, mas este ResultSet é FORWARD_ONLY (somente para frente).

org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkScrollable(AbstractJdbc2ResultSet.java:190)

org.postgresql.jdbc2.AbstractJdbc2ResultSet.first(AbstractJdbc2ResultSet.java:275)

br.direito.defesas.dao.ContatoDAO.getLista_cc(ContatoDAO.java:153)

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

java.lang.reflect.Method.invoke(Unknown Source)

org.apache.commons.el.ArraySuffix.evaluate(ArraySuffix.java:314)

org.apache.commons.el.ComplexValue.evaluate(ComplexValue.java:145)

org.apache.commons.el.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluatorImpl.java:263)

org.apache.commons.el.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluatorImpl.java:190)

org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:922)

org.apache.jsp.rel_005fbancas_jsp._jspx_meth_c_forEach_0(org.apache.jsp.rel_005fbancas_jsp:219)

org.apache.jsp.rel_005fbancas_jsp._jspService(org.apache.jsp.rel_005fbancas_jsp:185)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Quero que apareça o nome do prof1.

Em uma tabela tenho o código dele, o nome está em outra tabela.

Na verdade tenho uma tabela candidato que tem um campo chamado Orientador que é relacionada com a Tabela Professores. E no primeiro SELECT faço uma consulta e “puxo” o nome_professor de lá.

Porém tenho uma outra tabela com o nome defesa que tem 4 campos: prof1, prof2, prof3 e prof4 que também são relacionadas com a tabela Professores e quero “puxar” o nome_professor para cada um desses prof.

Para não aparecer assim:

prof1: 26, prof2: 45, prof3: 15, prof4: 89, e sim o nome dos efetivos professores e não seus números.

Estava pensando em fazer vários SELECTS cada um puxando um professor.

abelgomes

vamos lá…
posta ai o script de criação desse banco…e o de inserção tb…
enxuga esse codigo…tira essa operação e tenta coloca-la la pra cima…

# if(rs.first()){   
#                   
#                     while(rs1.next()){  
#                           
#                         ContatoProfessores c=new ContatoProfessores();  
#                         c.setNome_professor(rs.getString("nome_professor"));  
#                         list_cc.add(c);  
#                     }  
#                 }

aqui vc tenta add na lista_cc umContatoProfessor, mas na declaração vc diz que ela é de Contato…ou vc usa duas lista…ou usa um map…

o erro é esse, mas da pra fazer isso so em um while
por acaso ContatoProfessor é subcalsse de Contato?
se sim ok

se nao esse é o erro…

tente essa solução que eu disse acima… :wink:

F

dependendo do drive nao aceita o .first … percorre uam vez soh e ja era o.O ai tem q apela pra gambi

simberg

Usei Contato também, o erro dá igual.

Na verdade Contato é um javabean, assim como ContatoProfessor.

Há vários javabeans, para professor, candidato, local, etc.

Como tive o problema de referênciar vários atributos de javabeans diferentes, uma sugestão que adotei e que funcionou em outras partes do programa, foi de criar o Contato, onde nele estariam os atributos de vários javabeans criados.

Essa é a página em jsp, que exibe os resultados.

<%@ page import="java.util.*,br.direito.defesas.*,br.direito.defesas.dao.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<html>
<head>
<script language="JavaScript">
<!--


function tipo(){

//	if(1==1){
		alert(document.form1.txtTipo.value);
//	}else{
//		document.form1.txtTipo.value="doutorado";
//	}
}
//-->
</script>
</head>
<body>
<%@ include file="topo.jsp" %>


<table width="780"><tr><td align="center">
<h3>Relação das Bancas</h3>
</td></tr>
</table>
<form name="form1" id="form1" method="post" action="bdinclusaoprofessores">
<table width="780" border="1">

<jsp:useBean id="dao" class="br.direito.defesas.dao.ContatoDAO" />

       <c:forEach var="contato" items="${dao.lista_cc}">
<tr bgcolor="#990000">
	<TD>
		<font size="2" color="#FFFFFF"><fmt:formatDate value="${contato.data}" pattern="dd-MM-yyyy" /> </font>
	</TD>
	<td>
		<font size="2" color="#FFFFFF"><fmt:formatDate value="${contato.horario}" pattern="HH:mm" /></font>
	</td>
	<td>
		<font size="2" color="#FFFFFF">${contato.descricao}</font>
	</td>
	<td>
		<script language="JavaScript">
			if(${contato.tipo}==true){
			    document.write("<font size='2' color='#FFFFFF'>Doutorado</font>");
			}
			else{
				document.write("<font size='2'  color='#FFFFFF'>Mestrado</font>");
			} 
		</script>
	</td>
</tr>
<tr>
	<td colspan="2">
		<font size='2'>Nome do Aluno</font>
	</td>
	<td>
		<font size='2'>Orientador</font>
	</td>
	<td>
		<font size='2'>Título</font>
	</td>
</tr>
<tr>
	<TD colspan="2">	
       	<font size="2">${contato.nome_aluno}</font>
    </td>
    <td>
    	<font size="2">${contato.nome_professor}</font>
    </td>   	
	<td>
    	<font size="2">${contato.titulo}</font>
    </td>
    <td>
    </td>  
</tr>
<tr>
	<td colspan="3">
		Banca 
		${contato.numero} - <a href="bdgerarelatorio?numero=${contato.numero}">Relatório</a>
	</td>
	<td>

${contato.prof1}<br>
${contato.prof2}<br>
${contato.prof3}<br>
${contato.prof4}	

</c:forEach> 

	</td>
</tr>

    
</table>   
</form>   

</body>
</html>

Essa página funciona, se quiser apenas os campos que estão ai, com os números dos professores, mas quero colocar o nome desses professores também.

Na minha DAO o código ficaria assim:

public List<Contato> getLista_cc ()  throws SQLException{
		PreparedStatement stmt= this.connection.prepareStatement("SELECT local.descricao, defesa.prof1, defesa.prof2, defesa.prof3, defesa.prof4, defesa.numero, defesa.data, defesa.horario, candidatos.nome_aluno, candidatos.titulo, candidatos.tipo, professores.nome_professor FROM local INNER JOIN (professores INNER JOIN (candidatos INNER JOIN defesa ON candidatos.idc = defesa.candidato) ON professores.idp = candidatos.orientador) ON local.idl = defesa.local order by defesa.data;");
		ResultSet rs=stmt.executeQuery();
				ArrayList<Contato>list_cc = new ArrayList<Contato>();
		while(rs.next()){
				
				Contato c1=new Contato();
				numerox=rs.getInt("numero");
				c1.setNumero(rs.getInt("numero"));	
				c1.setData(rs.getDate("data"));
				c1.setHorario(rs.getTime("horario"));
				c1.setNome_aluno(rs.getString("nome_aluno"));
				c1.setTitulo(rs.getString("titulo"));
				c1.setTipo(rs.getBoolean("tipo"));
				c1.setNome_professor(rs.getString("nome_professor"));
				c1.setDescricao(rs.getString("descricao"));
				c1.setProf1(rs.getInt("prof1"));
				c1.setProf2(rs.getInt("prof2"));
				c1.setProf3(rs.getInt("prof3"));
				c1.setProf4(rs.getInt("prof4"));
				list_cc.add(c1);
				
					}
		rs.close();
		stmt.close();
		return list_cc;
	}

Quero incluir na DAO e na página em JSP uma forma de pegar os nomes do prof1, prof2, prof3 e prof4 que estão relacionados com a tabela de professores e não apenas seus números.

Deixei os códigos funcionais, sem as inclusões que queria.
Não sei se consegui me fazer entender.

abelgomes

cara isso ta muito estranho, faça ai oque eu te pedi…qual o SGBD que vc esta usando? gera la o script de criação e manda pra mim…

vou testar aqui…

simberg

Utilizo o postgreSQL,

Faço a conexão através da classe ConnectionFactory.

package br.direito.defesas;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {
	
	public static Connection getConnection() throws SQLException{
		try{
			Class.forName("org.postgresql.Driver");
			return DriverManager.getConnection("jdbc:postgresql://****","usuario","senha");
			
		}catch(ClassNotFoundException e){
			throw new SQLException(e.getMessage());
		}
	}
}

Uma classe para todo o sistema. Já tem funcionando, cadastro, edição e exclusão de professores, bancas, locais, candidatos.

Era isso que vc queria?

abelgomes

nao…eu quero que vc va no pgadmin e gere os scripits de criação e insercao do banco de dados…

pra eu poder testar essa sua query, dao etc…pq to achando sua query muito estranha…achoq ue el pode ser diminuida…

simberg

Te enviei por e-mail o que me pediu.

Mesmo assim, o código que coloquei funciona, quero sim e incluir o nome dos professores ao invés dos códigos.

Obrigado.

abelgomes

vc tem que selecionar tb o nome do professor, ao inves de dar um getInt no codigo dar um getString no nome :wink:

fiz uma coisa mais simples…funcionou…

simberg

Sim, eu sei, veja:

Contato c1=new Contato();

numerox=rs.getInt(“numero”);

c1.setNumero(rs.getInt(“numero”));

c1.setData(rs.getDate(“data”));

c1.setHorario(rs.getTime(“horario”));

c1.setNome_aluno(rs.getString(“nome_aluno”));

c1.setTitulo(rs.getString(“titulo”));

c1.setTipo(rs.getBoolean(“tipo”));

c1.setNome_professor(rs.getString(“nome_professor”)); -----> foi feito, mas pega o valor do orientador da tabela de candidatos.

c1.setDescricao(rs.getString(“descricao”));

c1.setProf1(rs.getInt(“prof1”)); -----> quero pegar os valores dos nomes desses professores, na verdade esses 4.

c1.setProf2(rs.getInt(“prof2”));

c1.setProf3(rs.getInt(“prof3”));

c1.setProf4(rs.getInt(“prof4”));

list_cc.add(c1);

abelgomes

quem é c1.setProf1? é um inteiro ou um objeto do tipo professor?

se for um objeto, vc ta tentando atribuir um inteiro…:s

da uma olhada nessa cara, da um clean nesse seu projeto e manda ele pro meu e-mail…

simberg

Mestre,

É um inteiro.

Deixa eu explicar:

Esse sistema é para defesa de tese e dissertação (Mestrado e Doutorado).

Um candidato tem um orientador ligado a ele.

No dia da Defesa, a banca é formada pelo orientador e mais 4 professores.

prof1 é o número de um desses professores.

Na primeira query que fiz estavam apenas os números desses professores, com exceção da chamada para o nome do professor orientador.

Quero obter os nomes dos outros 4 professores, por isso abri outra query, para chamar o prof1 e pegar seu nome.

Posso fazer separadamente criando outra lista, porém, não estou conseguindo ligar o número da banca nessa lista separada.

Espero ter me explicado adequadamente.

Muito obrigado pela força.

abelgomes

é o relacionamento entao…no banco é um integer, mas no Java tem que ser um objeto…ta assim?

simberg

Teria como fazer uma lista encadeada?

Com 5 selects, com where para o campo do número da banca, conseguindo o nome do professor para cada prof (n)?

simberg

Teria como fazer uma lista encadeada?

Com 5 selects, com where para o campo do número da banca, conseguindo o nome do professor para cada prof (n)?

abelgomes

como esta o seu relionamento?é por objeto ou por codigo?

simberg

O relacionamento está feito no banco de dados

1 para vários cada prof (1 a 4) tem relacionamento com a tabela professores campo idp.

Por isso só dá para fazer um select por vez. Um para cada prof.

Tem como colocar um select dentro do outro??

Isso que não consigo, não consigo pegar o número da Banca como referência where, dentro do looping, para gerar o nome desses professores.

O código sql funciona separadamente, já testei, só com os números dos prof(n) e com o nome do Orientador, funciona, mas quero colocar o nome dos prof, ao invés dos seus números.

É meio complicado de explicar, mas não de visualizar.


simberg

Aparece do lado direito 4 números são os 4 prof(n). Ao invés dos números deles que estão na tabela Bancas, quero colocar os nomes que estão na tabela professores.

Mas, para isso preciso de um outro select, na verdade creio que mais 4, dentro do primeiro que já existe e que já gera essa lista.

Será que isso é possível?

abelgomes

sim no banco de dados…mas na classe, se é 1 pra varios, vc tem que ter um List de professores no outro lado…é isso que eu quero te dizer, para qaundo vc for fazer uma consulta…associar um objeto ao outro e nao apenas o codigo…

simberg

Mas, não estaria fazendo essa associação no próprio select? Quando associo uma tabela na outra?

Na imagem acima, há várias tabelas que trabalham funcionando na mesma lista através do select e de um javabean em comum.

Será que entendi bem o que vc me falou, lembre-se ainda sou um gafanhoto em java.

abelgomes

seim…vc associa no banco de dados como fk…mas nas classes tb tem que ser feito essa associacao… :wink: é por isso que ta dando errado…professor nao tem que ser do tipo int…mas sim do tipo professor…e vc tem que trazer os objetos relacionados…

simberg

Como se faz isso?

simberg

E se fizesse isso:

//Primeira lista

	public List<Contato> getLista_cc ()  throws SQLException{
		PreparedStatement stmt= this.connection.prepareStatement("SELECT local.descricao, defesa.prof1, defesa.prof2, defesa.prof3, defesa.prof4, defesa.numero, defesa.data, defesa.horario, candidatos.nome_aluno, candidatos.titulo, candidatos.tipo, professores.nome_professor FROM local INNER JOIN (professores INNER JOIN (candidatos INNER JOIN defesa ON candidatos.idc = defesa.candidato) ON professores.idp = candidatos.orientador) ON local.idl = defesa.local order by defesa.data;");
		ResultSet rs=stmt.executeQuery();
		
		ArrayList<Contato>list_cc = new ArrayList<Contato>();
		while(rs.next()){
				
				Contato c1=new Contato();
				numerox=rs.getInt("numero");
				c1.setNumero(rs.getInt("numero"));	
				c1.setData(rs.getDate("data"));
				c1.setHorario(rs.getTime("horario"));
				c1.setNome_aluno(rs.getString("nome_aluno"));
				c1.setTitulo(rs.getString("titulo"));
				c1.setTipo(rs.getBoolean("tipo"));
				c1.setNome_professor(rs.getString("nome_professor"));
				c1.setDescricao(rs.getString("descricao"));
				list_cc.add(c1);		
			
		}
		rs.close();
		stmt.close();
		return list_cc;
	}	
	
// Segunda lista pegando o valor "numerox" da primeira, pegaria assim o nome do professor do Prof1.

	public List<Contato>getLista_cc2 ()  throws SQLException{
		PreparedStatement stmt= this.connection.prepareStatement("SELECT defesa.prof1, defesa.numero, professores.nome_professor FROM defesa INNER JOIN professores ON professores.idp = defesa.prof1 where defesa.numero="+numerox);
		ResultSet rs=stmt.executeQuery();
		ArrayList<Contato>list_cc2 = new ArrayList<Contato>();
		while(rs.next()){
			Contato c1=new Contato();
			
			
			c1.setNome_professor(rs.getString("nome_professor"));

			list_cc2.add(c1);
		}
		rs.close();
		stmt.close();
		return list_cc2;
	}

O problema seria colocar isso na página JSP junto. Isso que não consigo fazer.

abelgomes

peczenyj

puxa…

Se vc tem prepared statement pq esta concatenando string pra gerar o SQL?
Outra coisa, pq vc não pega apenas os dados que vc precisa no SQL? Se eu só preciso do nome do professor, não coloca outras coisas no select. Alias vc pensar em coloca isso na JSP? Isso deveria ficar no minimo na sua Action.
Sem falar que o numerox surgiu “do nada” nesse ultimo método… medo …

Acho que vc precisa estudar como funciona o DAO (olha os primeiros capitulos):

simberg

Acho que tá enrolado.

Agradeço a atenção e a força.

Primeiro não preciso apenas do nome do professor, preciso de várias coisas, o que talvez não tenha ficado claro é que me falta apenas colocar o nome dos 4 professores.

A página em JSP é para o usuário, seguindo o modelo (MVC), sem regras de negócio e sem consistência com bd. Coloquei uma imagem da página.

O numerox, está desde o primeira mensagem, não incluí agora.


Acho que a solução deve ser simples, eu que estou me enrolando em explicar.

O sistema está funcionando em muitas coisas, apenas esse entrave tem me amolado muito.

Quando a coisa é mais simples, como inclusão, exclusão e edição de local, professor, candidato, fiz facilmente.

Porém nesse caso que preciso mesclar duas listas tenho me enrolado.

Tá tudo funcionando, não tem falha nenhuma, só quero fazer uma implementação.


Deixa eu tentar explicar…
Eu tenho funcionando o que está abaixo, em forma de lista para as bancas, cada grupo desses é para uma banca.

data hora local tipo
Nome do Aluno Orientador Título
Banca nº 61 - Prof1: 52 - Prof2: 23 - Prof3: 5- Prof4: 89

Mas não quero os números dos prof1 a prof4, quero os nomes dos devidos professores. É isso que não consigo.

Deve ser fácil, mas não consigo.

O que fiz foi criar outra lista lista_cc2, com um select puxando o numerox (que é o número da banca), para obter o nome do professor1.

É só isso que preciso o resto funciona.

Mais uma vez agradeço.

simberg

Consegui:

No DAO:

public List<Contato> getLista_cc ()  throws SQLException{
		PreparedStatement stmt= this.connection.prepareStatement("SELECT candidatos.nome_aluno, candidatos.titulo, candidatos.tipo, local.descricao, defesa.data, defesa.horario, defesa.numero FROM local INNER JOIN (candidatos INNER JOIN defesa ON candidatos.idc = defesa.candidato) ON local.idl = defesa.local order by defesa.data, defesa.horario;");
		ResultSet rs=stmt.executeQuery();
		
		ArrayList<Contato>list_cc = new ArrayList<Contato>();
		while(rs.next()){
				
				Contato c1=new Contato();
						
				numerox=rs.getInt("numero");   //  havia declarado a variável mais acima
				
				c1.setNumero(rs.getInt("numero"));	
				c1.setData(rs.getDate("data"));
				c1.setHorario(rs.getTime("horario"));
				c1.setNome_aluno(rs.getString("nome_aluno"));
				c1.setTitulo(rs.getString("titulo"));
				c1.setTipo(rs.getBoolean("tipo"));
				c1.setDescricao(rs.getString("descricao"));
				c1.setNome_professor(getLista_cc2(numerox));   // atribuo o valor de numerox para a lista abaixo e ao mesmo tempo "seto" a lista dos professores
				
				list_cc.add(c1);
		}
		rs.close();
		stmt.close();
		return list_cc;
	}	

//recebo o valor da banca acima

	public String getLista_cc2 (Integer numero) throws SQLException{
		PreparedStatement stmt= this.connection.prepareStatement("SELECT professores.nome_professor FROM professores INNER JOIN (defesa INNER JOIN subbanca ON defesa.numero = subbanca.defesa) ON professores.idp = subbanca.numero_professor where subbanca.defesa="+ numero);
		ResultSet rs= stmt.executeQuery();
		String lista_professores = "";	
		
		while(rs.next()){
			
			lista_professores += rs.getString("nome_professor") +"<br>";   //faço uma simples concatenação de Strings
		}
		rs.close();
		stmt.close();
		return "<b>Presidente:</b> "+ lista_professores;		
	}

No jsp

<jsp:useBean id="dao" class="br.direito.defesas.dao.ContatoDAO" />

       <c:forEach var="contato" items="${dao.lista_cc}">
<tr bgcolor="#990000">
	<TD>
		<font size="2" color="#FFFFFF"><fmt:formatDate value="${contato.data}" pattern="dd-MM-yyyy" /> </font>
	</TD>
	<td>
		<font size="2" color="#FFFFFF"><fmt:formatDate value="${contato.horario}" pattern="HH:mm" /></font>
	</td>
	<td>
		<font size="2" color="#FFFFFF">${contato.descricao}</font>
	</td>
	<td>
		<script language="JavaScript">
			if(${contato.tipo}==true){
			    document.write("<font size='2' color='#FFFFFF'>Doutorado</font>");
			}
			else{
				document.write("<font size='2'  color='#FFFFFF'>Mestrado</font>");
			} 
		</script>
	</td>
</tr>
<tr>
	<td colspan="2">
		<font size='2'>Nome do Aluno</font>
	</td>
	<td>
		<font size='2'>Banca</font>
	</td>
	<td>
		<font size='2'>Título</font>
	</td>
</tr>
<tr>
	<TD colspan="2">	
       	<font size="2"><b>${contato.nome_aluno}</b></font>
    </td>
    <td>
				    
    	<font size="2">${contato.numero}</font>
    	
     </td>   	
	<td>
    	<font size="2">${contato.titulo}</font>
    </td>
    <td>
    </td>  
</tr>
<tr>
	<td colspan="3">
	<font size="2">${contato.nome_professor} </font>
	
	</td>
	<td>
		Comissão Julgadora		         

	</td>
</tr>

   </c:forEach>

Obrigado pela força!

Criado 21 de outubro de 2008
Ultima resposta 3 de nov. de 2008
Respostas 28
Participantes 4