Duvidas com clausula where no Hibernate

Ola boa tarde

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=?");
	}

Pagina JSP

      <c:forEach items="${cliente}" var="cliente">
         <tr>
           <td>${cliente.cliCod}</td>
           <td>${cliente.cliNam}</td>
           <td>${cliente.cliAdd}</td>
           <td>${cliente.cliCep}</td>
           <td>${cliente.cliCit}</td>
           <td><a href="mostraCliente?id=${cliente.cliCod}">Alterar</a></td>
         </tr>
      </c:forEach

Action do Struts

public class MostraClienteAction {
	
	private Long cliCod;
	private Clients cliente;
	
	@Action (value="mostraCliente", results = {
	     @Result(name="ok", location="/mostra-clientes.jsp")
	 })
	 
	 public String execute() {
		cliente = (Clients) new ClientDAO().ShowClients(cliCod);
		return "ok";
	}

	public Clients getCliente() {
		return cliente;
	}

	public void setId(Long cliCod) {
		this.cliCod = cliCod;
	}

}

Se nao fui claro me perguntem que explico novamente

Ficaria assim.

  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);  
  }  

espero ter ajuado.

Olá Alan

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)

Desde já agradeço sua ajuda!!!

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.

[quote=pispico]Ola boa tarde

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;
	}

Ola

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.

Olá galera

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);
		}

obrigado a todos pela ajuda!!