Possuo um form com dois combos:
1 - Grupo
2 - Operadores
Quando seleciono o combo grupos ele traz o combo operadores preenchido dando um submit através de uma função javascript, no entanto o campo grupo não mantém a opção escolhida.
Segue meu código:
E dessa forma o combo não mantém o grupo selecionado ao listar o combo dos operadores. É como se o “operador.grupo.idgrupo” não estivesse retornando nada…
Rafael_Guerreiro
Ele já está populando a lista na view quando vc dá o result.include(“lista_grupo”,lista_grupo); dentro do método, não há necessidade de retornar a lista o método pode ser void.
Se ele não entra no IF é porque ele não passou no teste
Esse é o problema da JSP, não da para debugar, faz assim:
Operador = ${operador.grupo.idgrupo}<br />G: ${g.idgrupo}
<!-- antes de entrar no if, mostra os valores na tela mesmo -->
<c:if test="${operador.grupo.idgrupo == g.idgrupo}">">
<option selected="selected" value="<c:out value="${g.idgrupo}" />"><c:out value="${g.nome}" /></option>
</c:if>
Acho que dessa forma você consegue descobrir o que está acontecendo.
Uma perguntinha, qual a finalidade desse IF??
salmaox
Você tem razão Rafael, não precisa mesmo do método ser List já que o result envia pra view…Alterei o método pra void, obrigado. A idéia do IF é comparar os elementos da lista(combo do grupo) com o valor do combo(grupo) na hora do refresh da página.
Por exemplo: qnd eu selecionar um grupo no combo ele dá um submit, faz uma consulta no banco e traz no combo de baixo, todos os operadores referentes àquele grupo.
Estou com um probleminha no minha string sql se puder me ajudar…Acho q isso resolveria meu problema.
public List<Operador> listaOperadorPorGrupo(Operador operador){
String sql = "FROM Operador o INNER JOIN Grupo g ON (o.id_grupo = g.id_grupo) where o.id_grupo = "+operador.getGrupo().getIdgrupo()+"";
Query q = this.session.createQuery(sql);
List lista = q.list();
return lista;
}
ele dá o seguinte erro:
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: FROM near line 1, column 8 [select FROM br.org.cemaden.bean.Operador o INNER JOIN Grupo g ON (o.id_grupo = g.id_grupo) where o.id_grupo = 2]
Obrigado
Rafael_Guerreiro
Por que você não trabalha com Criteria? Acho bem mais fácil e não dá erro de sintaxe SQL.
Acho que ao invés de trazer a lista TODA e verificar se o item faz parte do grupo, vc deveria receber o grupo no submit e trazer somente a lista daquele grupo.
Assim a requisição ao banco de dados e a hora de popular a tela ficam mais rápidos.
Me mostra como estão as classes Operador e Grupo.
salmaox
Rafael, desculpe a demora na resposta. Precisei me ausentar do trabalho…
Eu tentei com o Criteria, mas apanhei tanto que desisti…
Esse criteria eu ja tentei antes…tentei novamente mas dá esse erro: org.hibernate.QueryException: could not resolve property: idgrupo of: br.org.cemaden.bean.Operador
mas tá dando essa exception: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.org.cemaden.bean.Grupo.idgrupo
Rafael_Guerreiro
Esse erro é por que o parametro da propriedade está com nome errado.
Por que você não segue o padrão java de camelCase?
Ve se assim resolve (eu tinha errado o nome das variáveis e coloquei um Alias):
public List<Operador> listaOperadorPorGrupo(Operador operador){
//String sql = "FROM Operador o INNER JOIN Grupo g ON (o.id_grupo = g.id_grupo) where o.id_grupo = "+operador.getGrupo().getIdgrupo()+"";
//Query q = this.session.createQuery(sql);
//List lista = q.list();
//return lista;
return this.session
.createCriteria(Operador.class)
.createAlias("grupo", "grupo")
.add(Restrictions.eq("grupo.idgrupo", operador.getGrupo()
.getIdgrupo())).list();
}
salmaox
agora deu certo mas ele não entra nesse primeiro IF e não mantém a opção selecionada, eu preciso que ele mantenha o combo selecionado para fazer o cadastro do gerente…
variável ${operador.grupo.idgrupo} traz qnd dá o submit pelo combo na primeira vez…senão nem carregava o método listaOperadorPorGrupo onde é passado o idgrupo por parâmetro. Só que após esse submit ela parece que fica null…
Rafael_Guerreiro
Então, quando você executar o método listaOperadorPorGrupo você deve dar um result.include e incluir a variável de novo. Essa variável só é incluida automaticamente quando ela for SessionScoped, mas ai ela será incluida em TODAS as requisições (mesmo as que não tiverem nada a ver).
salmaox
Isso mesmo Rafael consegui Muito obrigado pela ajuda e paciência. Vlw mesmo…