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.
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
}
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.
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;
@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;
}
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,