Estou com o seguinte cenario, tenho uma pagina JSP que lista todos os meus usuarios e ao lado de cada usuario tenho o botao alterar, ao clicar neste botao é chamada uma Action(Struts2) que ira chamar o DAO para listar os dados deste usuario em uma outra tela jsp, porem ocorre um problema quando peco para listar, acredito que seja problema na minha logica no dao…vou colocar abaixo a forma que esta o meu dao de listar o usuario por id.
Alguem sabe me dizer se estou utilizando a clausula where corretamente?
DAO
public List<Clients> ShowClients(Long cliCod) {
return (List<Clients>) this.session.createQuery("select cliente from Clients as cliente where CliCod=?");
}
public List<Clients> ShowClients(Long cliCod) {
return (List<Clients>) this.session.createQuery("select cliente from Clients as cliente where cliente.codigo= :cliCod").setParameter("cliCod", cliCod);
}
Tentei fazer da forma como você me disse, porem retornou o erro abaixo.
Nao consegui entender o trecho do codigo muito bem será que poderia me explicar?
(“select cliente from Clients as cliente where cliente.codigo= :cliCod”)
.setParameter(“cliCod”, cliCod);
Ate onde consegui entender ele faz um select de cliente na tabela Clients onde o valor de cliente.codigo(este é o valor da expression language que vem do JSP?) for igual cliCod (este cliCod é do bean?). A parte do .setParameter nao entendi pra que serve ( ele da o valor de cliCod para “cliCod”??)
org.hibernate.QueryException: could not resolve property: codigo of: br.com.stalit.sendtime.beans.Clients [select cliente from br.com.stalit.sendtime.beans.Clients as cliente where cliente.codigo= :cliCod]
org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)
org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61)
org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1375)
org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:304)
org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:410)
po brother se vc ler o erro verá que o campo codigo não existe na entidade cliente, eu coloquei codigo pq eu uso como padrão mais foi pra vc entender que era pra usar o atributo que seja corresspondente ao id da sua entidade, bem provavel que vc use outro nome, então so substituir e testar e vamos tentar juntos resolver isso ae.
Estou com o seguinte cenario, tenho uma pagina JSP que lista todos os meus usuarios e ao lado de cada usuario tenho o botao alterar, ao clicar neste botao é chamada uma Action(Struts2) que ira chamar o DAO para listar os dados deste usuario em uma outra tela jsp, porem ocorre um problema quando peco para listar, acredito que seja problema na minha logica no dao…vou colocar abaixo a forma que esta o meu dao de listar o usuario por id.
Alguem sabe me dizer se estou utilizando a clausula where corretamente?
DAO
public List<Clients> ShowClients(Long cliCod) {
return (List<Clients>) this.session.createQuery("select cliente from Clients as cliente where CliCod=?");
}
[/quote]
Como vc espera que um Query se transforme num List ? Magia ?
O método createQuery, como o nome indica cria uma query. Ou seja um objeto Query.
Portanto, primeira alteção
public List<Clients> ShowClients(Long cliCod) {
Query query = this.session.createQuery("select cliente from Clients as cliente where CliCod=?");
@SupressWarnings("uncheked") List<Clients> lista = ...
return lista;
}
Depois vc tem um “?” na query o que significa que tem que setar o parametro.
Segunda alteração
public List<Clients> ShowClients(Long cliCod) {
Query query = this.session.createQuery("select cliente from Clients as cliente where CliCod=?");
query.setLong(1, cliCod);
@SupressWarnings("uncheked") List<Clients> lista = ...
return lista;
}
Por fim, vc precisa executar a query. Como vc espera uma lista de objetos, vc executa chamando o método list
O codigo final é
public List<Clients> ShowClients(Long cliCod) {
Query query = this.session.createQuery("select cliente from Clients as cliente where CliCod=?");
query.setLong(1, cliCod);
@SupressWarnings("uncheked") List<Clients> lista = query.list();
return lista;
}
Meu codigo esta da seguinte forma:
Pelo que entendi o trecho Clients.CliCod é referente a tabela e o campo
public List<Clients> ShowClients(Long cliCod) {
return (List<Clients>) this.session.createQuery("select cliente from Clients as cliente where Clients.CliCod = :cliCod")
.setParameter("cliCod", cliCod);
}
Este é o erro que ocasiona
Hibernate:
select
this_.CliCod as CliCod1_0_,
this_.CliAdd as CliAdd1_0_,
this_.CliCep as CliCep1_0_,
this_.CliCit as CliCit1_0_,
this_.CliNam as CliNam1_0_
from
Clients this_
4418 [http-8080-1] ERROR org.hibernate.hql.PARSER - Invalid path: 'null.CliCod'
4419 [http-8080-1] ERROR org.hibernate.hql.PARSER - <AST>:0:0: unexpected end of subtree
4419 [http-8080-1] ERROR org.hibernate.hql.PARSER - left-hand operand of a binary operator was null
Eu tenho quase certeza que estou fazendo besteira na parte de
return (List<Clients>) this.session.createQuery("select cliente from Clients as cliente where Clients.CliCod = :cliCod")
.setParameter("cliCod", cliCod);
A minha tabela no banco chama Clients e o campo chama CliCod, fiz o debug e ate a action do struts2 ele puxou o valor do Clicod com sucesso porem quando vai para o proximo passo o erro retorna.
Consegui achar o problema, alem de eu estar criando uma lista para retornar um unico valor, pois a PK era o clicod e dado o valor do clicod retornaria somente os dados do cliente(nome,endereco…etc.) o codigo estava uma bagugunca.
Um amigo do trampo me ajudou e ficou desta forma o codigo final no DAO.
public Clients ShowClients(Long cliCod) {
return (Clients) this.session.load(Clients .class,cliCod);
}