Olá pessoal,
estou com um problema + ou - assim:
quando vou buscar uma “Dependencia” (é o nome da classe (nome dado pras salas)) no banco eu tenho uma espécie de factory que pra montar a Dependência (objeto) que precisa de 2 objetos da classe Usuário (detentorDir e dententorInd) que na tabela de dependencias estão armazenados somente com os Ids.
há alguma forma de fazer uma outra busca no banco? (pra pegar o restante dos dados dos usuários sem fechar o ResultSet das dependencias??)
olhem o código:
List listaDependencias = new ArrayList();
try {
Statement stm = SingletonStm.getInstance().getStatement();
ResultSet rs = stm.executeQuery(SQLs.procurarDependenciasRestricoes(codigo, descricao, situacao,
detentordir_id, docdetentordir, detentorind_id, docdetentorind, obs, ordenacao));
while (rs.next()){
Dependencia dependencia = new Dependencia();
if (rs.getObject("id") != null) dependencia.setId(new Integer(rs.getInt("id")));
if (rs.getObject("codigo") != null) dependencia.setCodigo(new Integer(rs.getInt("codigo")));
if (rs.getObject("descricao") != null) dependencia.setDescricao(rs.getString("descricao"));
if (rs.getObject("situacao") != null) dependencia.setSituacao(new Integer(rs.getInt("situacao")));
if (rs.getObject("detentordir_id") != null) {
Integer diretoId = new Integer(rs.getInt("detentordir_id"));
dependencia.setDetentorDir(GerenteUsuario.procuraUsuarioId(diretoId, null));
}
if (rs.getObject("docdetentordir") != null) dependencia.setDocDetentorDir(rs.getString("docdetentordir"));
if (rs.getObject("detentorind_id") != null) {
Integer indiretoId = new Integer(rs.getInt("detentorind_id"));
dependencia.setDetentorInd(GerenteUsuario.procuraUsuarioId(indiretoId, null));
}
if (rs.getObject("docdetentorind") != null) dependencia.setDocDetentorInd(rs.getString("docdetentorind"));
if (rs.getObject("obs") != null) dependencia.setObs(rs.getString("obs"));
listaDependencias.add(dependencia);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return listaDependencias;
depois de:
dependencia.setDetentorDir(GerenteUsuario.procuraUsuarioId(diretoId, null));
o ResultSet (rs) já está fechado pois a classe GerenteUsuario fez uma busca no banco…
tava querendo consertar isso sem precisar fazer uma busca no banco mais elaborada, ou seja, pegando as informações dos usuários no query, visto que já há a classe GerenteUsuario que me retorna um objeto facilmente…
não sei se me fiz entender, mas qq ajuda é bem vinda…
Obrigado.
O problema é tentar realizar outra consulta enquanto a primeira ainda está rodando.
Soluções:
- Fazer a outra consulta usando uma conexão diferente.
- Fazer a outra consulta depois que tiver terminado de carregar a lista
- Fazer uma consulta com join entre tabelas para já trazer todos os dados.
Obs: Feche os seus Statements e ResultSets quando terminar de usá-los.
olá Bruno,
algumas considerações:
- Fazer a outra consulta usando uma conexão diferente - Fica difícil por usar o Singleton…
- Fazer uma consulta com join entre tabelas para já trazer todos os dados - já fiz e funcionou, mas queria evitar pra deixar um código mais “clean”
- Fazer a outra consulta depois que tiver terminado de carregar a lista - como seria isso? salvaria uma lista com os dados das dependencias e uma com os id dos usuários pra depois de popular as duas e juntar fazendo os querys dos usuários pelos id
olha o código com o join:
try {
Statement stm = SingletonStm.getInstance().getStatement();
ResultSet rs = stm.executeQuery(SQLs.procurarDependenciaId(id));
ResultSet rs2 = rs;
while (rs2.next()){
if (rs2.getObject("d.id") != null) dependencia.setId(new Integer(rs2.getInt("d.id")));
if (rs2.getObject("d.codigo") != null) dependencia.setCodigo(new Integer(rs2.getInt("d.codigo")));
if (rs2.getObject("d.descricao") != null) dependencia.setDescricao(rs2.getString("d.descricao"));
if (rs2.getObject("d.situacao") != null) dependencia.setSituacao(new Integer(rs2.getInt("d.situacao")));
if (rs2.getObject("d.docdetentorind") != null) dependencia.setDocDetentorInd(rs2.getString("d.docdetentorind"));
if (rs2.getObject("d.obs") != null) dependencia.setObs(rs2.getString("d.obs"));
if (rs2.getObject("d.docdetentordir") != null) dependencia.setDocDetentorDir(rs2.getString("d.docdetentordir"));
if (rs2.getObject("d.detentorDir_id") != null) {
Usuario usuario = new Usuario();
usuario.setId(new Integer(rs.getInt("d.detentordir_id")));
if (rs.getObject("detentorDir.nome") != null) usuario.setNome(rs.getString("detentorDir.nome"));
if (rs.getObject("detentorDir.login") != null) usuario.setLogin(rs.getString("detentorDir.login"));
if (rs.getObject("detentorDir.senha") != null) usuario.setSenha(rs.getString("detentorDir.senha"));
if (rs.getObject("detentorDir.email") != null) usuario.setEmail(rs.getString("detentorDir.email"));
if (rs.getObject("detentorDir.celular") != null) usuario.setCelular(rs.getString("detentorDir.celular"));
if (rs.getObject("detentorDir.posto_id") != null) usuario.setPostoId(new Integer(rs.getInt("detentorDir.posto_id")));
if (rs.getObject("detentorDir.status") != null) usuario.setEstado(new Integer(rs.getInt("detentorDir.status")));
if (rs.getObject("detentorDir.nivel") != null) usuario.setNivel(new Integer(rs.getInt("detentorDir.nivel")));
dependencia.setDetentorDir(usuario);
}
if (rs2.getObject("d.detentorInd_id") != null) {
Usuario usuario = new Usuario();
usuario.setId(new Integer(rs.getInt("d.detentorInd_id")));
if (rs.getObject("detentorInd.nome") != null) usuario.setNome(rs.getString("detentorInd.nome"));
if (rs.getObject("detentorInd.login") != null) usuario.setLogin(rs.getString("detentorInd.login"));
if (rs.getObject("detentorInd.senha") != null) usuario.setSenha(rs.getString("detentorInd.senha"));
if (rs.getObject("detentorInd.email") != null) usuario.setEmail(rs.getString("detentorInd.email"));
if (rs.getObject("detentorInd.celular") != null) usuario.setCelular(rs.getString("detentorInd.celular"));
if (rs.getObject("detentorInd.posto_id") != null) usuario.setPostoId(new Integer(rs.getInt("detentorInd.posto_id")));
if (rs.getObject("detentorInd.status") != null) usuario.setEstado(new Integer(rs.getInt("detentorInd.status")));
if (rs.getObject("detentorInd.nivel") != null) usuario.setNivel(new Integer(rs.getInt("detentorInd.nivel")));
dependencia.setDetentorInd(usuario);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
obs: vou fechar ainda o RS mas o Statement precisa fechar tb roda vez que fizer um query? eu fecho quando saio do programa.