Filtrar os itens de uma lista dentro de um Objeto

Boa tarde Pessoal

estou estudando Hibernante e cheguei num empasse q não sei como resolver.

Bom o problema é o seguinte, tenho um objeto Estado que tem uma lista de Cidades. E num relatório que estou desenvolvendo, o usuário poderá escolher entre Imprimir todos os estados ou selecionar um. Quando ele seleciona imprimir todos, o relatório é impresso com uma lista de todos os estados registrados.
Quando ele seleciona um estado, ele pode também selecionar entre imprimir todas as cidades do estado, ou selecionar uma (isso pq o relatório na realidade imprimi mais ou menos assim Estado -> Cidade -> Bairro -> Endereco). O problema é que eu preciso que seja listado somente a cidade desejada.

Eu não sei como montar o HQL para fazer com que a lista de cidades do estado, só contenha a cidade informada.

desde já agradeço

Eu faria assim: imaginando que voce tenha uma chave de identificacao de seus entities (estou supondo que seja um inteiro dado por cidadeId). Nao é a forma mais elegante, mas resolve!

try{
   Query query = session.createQuery("select cidade from Cidade cidade, Estado estado where estado.cidade = cidade and cidade.id = ?");
   query.setParameter(1, new Integer(cidadeId))
   Cidade cidadeEscolhida = (Cidade)query.uniqueResult();
}
catch(HibernateException he){
   //faca o que quiser
}

Mas provavelmente voce tenha algo assim:

Cidade cidadeEscolhida = null;
try{
   List<Estado> listaDeEstados = session.createCriteria(Estado.class).list();//em algum momento voce tem que pegar os estados da base de dados para exibir para o usuario
   outer:
   for (Estado estado : listaDeEstados())
      for (Cidade cidade : estado.getCidades())
         if(cidade.getId()==cidadeId){//aqui voce pega a cidade escolhida pelo usuario      
            cidadeEscolhida = cidade;
            break outer;
         }
}
catch(HibernateException he){
   //faca o que quiser
}

ate mais

Boa tarde Vini

Bom não bem assim que eu preciso…

é mais assim:

  • Usuário selecionou o estado 1
  • Dentro do estado tem uma lista de cidades certo
  • dentre as cidades que o estado 1 tem, ele quer que imprimar a cidade 20
  • como estou utilizando o JasperReport, eu fiz uma estrutura de relatório baseada na seguinte maneira:
    • Relatório base, lista os estados
    • Existe um Sub-relatório para lista as cidades
    • Dentro do Sub-relatório da cidade, tem um Sub-relatório para listar os bairros
    • Dentro do Sub-relatório do Bairro tem um Sub-relatório pra listar os endereços.
  • nisso eu passo para o jasper, uma lista de estados, cada estado tem sua lista de cidades, cada cidade tem uma lista de bairros e cada bairro tem uma lista de endereços.
  • eu não sei se eu seto no estado uma nova lista de cidades contendo somente a cidade selecionada ou se existe outra maneria… pois como a lista de cidades é buscada por lazy mode, a lista que está la faz esse trabalho de busca, so q filtrando somente por estado.

ai é a minha pergunta, o hibernate tem essa capacidade ou nao de nas sub listas poderem ser filtradas tb.

falow

Cara, o modo lazy do Hibernate vai retornar todas as cidades do estado quando voce fizer estado.getCidades(), nao tem jeito! Acho que voce vai ter que mudar a estrategia para montar seus relatorios. Trabalhei em um caso parecido onde tive que fazer um poupup com varios checkbox de servicos que o usuario deveria escolher. O problema é que meu entity bean Servico nao tem a informacao se ele foi “escolhido”, entao o que fiz foi o seguite: criei um ServicoChecked que estendia Servico.

public class Servico{
   //atributos e get e set metodos
}
public class ServicoChecked extends Servico{
   private boolean isChecked;
   //get e set para isChecked
}

entao, quando um servico fosse “checado” (ou escolhido) pelo usuario fazia isChecked = true;
Assim quando tinha que incluir deletar/alterar/incluir informacoes na base de dados sobre os servicos escolhidos pelo usuario eu incluia os servicos com isChecked == true;

Espero ter ajudado.

Eu resolvi o meu problema assim:

@Override protected Collection getBeanList() { List<Estado> estados = new ArrayList<Estado>(); if (rbtTodosEstados.isSelected()) { estados = estadoDAO.getAllEstados(); } else { if (panelEstado.getSelectedEstado() == null) { throw new IllegalArgumentException("Selecione um Estado"); } Estado estado = estadoDAO.find(panelEstado.getSelectedEstado().getId()); estados.add(estado); if (rbtSelCidade.isSelected()) { if (panelCidade.getSelectedCidade() == null) { throw new IllegalArgumentException("Selecione uma Cidade"); } List<Cidade> cidades = new ArrayList<Cidade>(); Cidade cidade = cidadeDAO.find(panelCidade.getSelectedCidade().getId()); cidades.add(cidade); estado.setCidades(cidades); if (rbtSelBairro.isSelected()) { if (panelBairro.getSelectedBairro() == null) { throw new IllegalArgumentException("Selecione um Bairro"); } List<Bairro> bairros = new ArrayList<Bairro>(); bairros.add(bairroDAO.find(panelBairro.getSelectedBairro().getId())); cidade.setBairros(bairros); } } } return estados; }

valeu pela ajuda

Na minha humilde opinião.

Não seria melhor ao inves de consultar isso no JasperReport, vc criar uma classe de serviço pra gerar este relatorio recebendo uma lista e a partir desta vc gera seu relatorio,

Algo do tipo

E apartir desta estado vc teria as cidades

Na realidade o Jasper só está recebendo o resultado da pesquisa…

pois a busca está sendo feito na tela.

a jogada que citei funcionou, mas não crei outra classe para isso não.

falow