Consulta em criteria [RESOLVIDO]

11 respostas
J

bom dia tenho 2 classes da seguinte maneira

ClientesVO

@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="codigo")
	private Integer codigo;
	
	@Column(name="tipo", length=10, nullable=true)
	private String tipo;
	
	@Column(name="nome", length=100, nullable=true)
	private String nome; 

        @OneToMany(mappedBy="cliente", cascade=CascadeType.ALL, fetch=FetchType.LAZY)  
	private Collection<VinculoVO> vinculo;

        //getters e setter omitidos

VinculoVO

@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="codigo")
	private Integer codigo;
	
	@ManyToOne (targetEntity=ClientesVO.class)
	@JoinColumn(name="cliente")  
	private ClientesVO cliente;

ou seja estou deixando claro que a classe sera 1 cliente para N vinculos, Mas minha duvida eh a seguinte como eu faria com CRITERIA a seguinte query?

SELECT * FROM clientes, vinculo where vinculo.cliente=clientes.codigo
* AND clientes.nome like ‘%ana%’

11 Respostas

Hebert_Coelho

Dá uma olhada aqui: JPA Consultas e Dicas.

J

tem 1 pagina sobre criteria que nao me ajudou…

J

Opa…
vai ficar algo assim:

Criteria criteria = DetachedCriteria.forClass(ClienteVO.class);
		
criteria.add(Restrictions.ilike("nome", "ana", MatchMode.ANYWHERE));


return criteria.list();

Acho que você nem precisa fazer o join com VinculoVO.
Qualquer coisa fala ai.
Abraços

J

eh que eu tenho uma tabela ( datagrid ) com dados do ClientesVO e VinculosVO

está tipo assim a estrutura da tabela

codigo vinculo - nome cliente - data do vinculo - etc…

J

eh nao deu muito certo o codigo q vc me passou…

J

Saquei, então fica mais ou menos assim:

Criteria criteria = session.createCriteria(VinculoVO.class,"VINCULO");  
        
criteria.createAlias("VINCULO.CLIENTE","CLIENTE");

criteria.add(Restrictions.ilike("CLIENTE.nome", "ana", MatchMode.ANYWHERE));  
		  
return criteria.list();

Na grid você pode usar tipo assim: vinculoVO.getCliente().blablabla…
O esquema que postei antes sobre gerar a criteria estava errado mesmo.
Entende?
Abraços

J

vou postar meu codigo está dando uma exception
org.hibernate.QueryException: could not resolve property: CLIENTE of: br.com.vinculo.model.VinculoVO

@SuppressWarnings("unchecked")
	public ArrayList<VinculoVO> filtrarTabelaVinculo(){
		Session sessao = null;
		try {
			sessao = getSessaoAberta().openSession();
			Criteria criteria = sessao.createCriteria(VinculoVO.class,"VINCULO");
			criteria.createAlias("VINCULO.CLIENTE","CLIENTE");  
			criteria.add(Restrictions.ilike("CLIENTE.nome", "ana", MatchMode.ANYWHERE));   
			
			return (ArrayList<VinculoVO>)criteria.list();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			// fechando a sessao com o BD
			if (sessao != null) {
				sessao.close();
			}
		}
	}



	public static void main(String[] args) {
		VinculoDAO dao = new VinculoDAO();

		for(VinculoVO corrente:dao.filtrarTabelaVinculo()){
			System.out.println(corrente.getDtVinculo());
		}
	}
J

O erro está dizendo que você não tem o atributo cliente dentro de VinculoVO, ele existe?

J
package br.com.vinculo.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.clientes.model.ClientesVO;
import br.com.planos.model.PlanosVO;

@ Entity
@Table (name="vinculo")
public class VinculoVO implements Serializable{
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="codigo")
	private Integer codigo;
	
	@ManyToOne (targetEntity=ClientesVO.class)
	@JoinColumn(name="cliente")  
	private ClientesVO cliente;
	
	@ManyToOne  
	@JoinColumn(name="plano")  
	private PlanosVO plano;
	
	@Temporal(TemporalType.TIMESTAMP)
	private Date dtVinculo;

	public Integer getCodigo() {
		return codigo;
	}

	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	public ClientesVO getCliente() {
		return cliente;
	}

	public void setCliente(ClientesVO cliente) {
		this.cliente = cliente;
	}

	public PlanosVO getPlano() {
		return plano;
	}

	public void setPlano(PlanosVO plano) {
		this.plano = plano;
	}

	public Date getDtVinculo() {
		return dtVinculo;
	}

	public void setDtVinculo(Date dtVinculo) {
		this.dtVinculo = dtVinculo;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		result = prime * result
				+ ((dtVinculo == null) ? 0 : dtVinculo.hashCode());
		result = prime * result + ((plano == null) ? 0 : plano.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		VinculoVO other = (VinculoVO) obj;
		if (cliente == null) {
			if (other.cliente != null)
				return false;
		} else if (!cliente.equals(other.cliente))
			return false;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		if (dtVinculo == null) {
			if (other.dtVinculo != null)
				return false;
		} else if (!dtVinculo.equals(other.dtVinculo))
			return false;
		if (plano == null) {
			if (other.plano != null)
				return false;
		} else if (!plano.equals(other.plano))
			return false;
		return true;
	}
	
	
	
	
	
	
}
J

Cara. Não tenho certeza aqui, mas o que você pode tentar é mudar de VINCULO.CLIENTE para VINCULO.cliente.
Vê se funciona.

J

consegui resolver realmente o que eu estava errando eh q eu nao estava usando o mesmo nome do atributo, ai ficou assim

/*
	 * SELECT * FROM `clientes`, vinculo where vinculo.cliente=clientes.codigo
	 *	AND clientes.nome like '%k%'
	 */
	@SuppressWarnings("unchecked")
	public ArrayList<VinculoVO> filtrarTabelaVinculo(String nome){
		Session sessao = null;
		try {
			sessao = getSessaoAberta().openSession();
			Criteria criteria = sessao.createCriteria(VinculoVO.class,"Vinculo");
			criteria.createAlias("Vinculo.cliente","cliente");
			criteria.add(Restrictions.ilike("cliente.nome", nome, MatchMode.ANYWHERE));   
			return (ArrayList<VinculoVO>)criteria.list();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			// fechando a sessao com o BD
			if (sessao != null) {
				sessao.close();
			}
		}
	}



	public static void main(String[] args) {
		VinculoDAO dao = new VinculoDAO();

		for(VinculoVO corrente:dao.filtrarTabelaVinculo("k")){
			System.out.println(corrente.getDtVinculo());
		}

	}

muito obrigado mesmo :D

Criado 28 de agosto de 2012
Ultima resposta 28 de ago. de 2012
Respostas 11
Participantes 3