Problemas com busca com criteria

Fala Pessoal, bom dia!

Estou tentando fazer uma busca com criteria aqui.
O negócio é o seguinte, tenho uma classe Consulta e tenho ela relacionada com as classes Paciente e Médico.
As classes Paciente e Médico são relacionadas com a classe pessoa, pois estou usando composição. E na busca eu tenho que digitar o nome do paciente e o nome do médico, para trazer as consultas desejadas.
Quando eu executo a busca, apresenta o seguinte erro:

br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.sisclinic.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:48)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)

root cause

org.hibernate.QueryException: could not resolve property: pessoa of: br.com.sisclinic.model.Consulta
	org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81)
	org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75)
	org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1451)
	org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathEntityName(CriteriaQueryTranslator.java:235)
	org.hibernate.loader.criteria.CriteriaQueryTranslator.createCriteriaEntityNameMap(CriteriaQueryTranslator.java:222)
	org.hibernate.loader.criteria.CriteriaQueryTranslator.<init>(CriteriaQueryTranslator.java:108)
	org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:83)
	org.hibernate.impl.SessionImpl.list(SessionImpl.java:1687)
	org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
	br.com.sisclinic.dao.ConsultaDAO.buscaConsultas(ConsultaDAO.java:66)
	br.com.sisclinic.controller.ConsultaController.resultadoBusca(ConsultaController.java:85)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.sisclinic.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:48)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)

O método DAO da busca:

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List<Consulta> buscaConsultas(Consulta consulta) {
		Criteria crit = session.createCriteria(Consulta.class)
		.createAlias("paciente", "p")
		.createAlias("medico", "m")
		.createAlias("pessoa", "a");
		Criterion paciente = Restrictions.ilike("p.a.nome", consulta.getPaciente().getPessoa().getNome(), MatchMode.ANYWHERE);
		Criterion medico = Restrictions.ilike("m.a.nome", consulta.getMedico().getPessoa().getNome(), MatchMode.ANYWHERE);
		Conjunction conjunction = Restrictions.conjunction();
		
		if(!consulta.getPaciente().getPessoa().getNome().isEmpty()) {
			conjunction.add(medico);}
		
		if(!consulta.getMedico().getPessoa().getNome().isEmpty()) {
			conjunction.add(paciente);}
		
		crit.add(conjunction);
		List resultados = crit.list();
		return resultados;
	}

Método do Controlador:

        public void busca() {
	}
	
	public void resultadoBusca(final Consulta consulta) {
		validator.checking(new Validations() {{
			that(!(consulta.getMedico().getPessoa().getNome().isEmpty() 
					&& consulta.getPaciente().getPessoa().getNome().isEmpty()), 
					"validaBusca.consulta", "consulta.busca");
		}});
		
		validator.onErrorRedirectTo(this).busca();
		result.include("consulta", consultaDAO.buscaConsultas(consulta));
	}

Classe Consulta:

@Entity
public class Consulta {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
	@JoinColumn(name = "id_medico")
	private Medico medico;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_paciente")
	private Paciente paciente;
	
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_tipopagamento")
	private TipoPagamento pagamento;
	
	@Column(name = "preco_consulta")
	private BigDecimal precoConsulta;
	
	@DateTimeFormat(pattern = "dd/MM/yyyy")
	@Temporal(TemporalType.DATE)
	private Date data = Calendar.getInstance().getTime();
	
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_agendaconsulta")
	private AgendaConsulta agendaConsulta;
	
	public Consulta(Long id, Medico medico, Paciente paciente,
			TipoPagamento pagamento, Date data, 
			BigDecimal precoConsulta, AgendaConsulta agendaConsulta) {
		this.id = id;
		this.medico = medico;
		this.paciente = paciente;
		this.pagamento = pagamento;
		this.data = data;
		this.precoConsulta = precoConsulta;
		this.agendaConsulta = agendaConsulta;
	}

	public Consulta() {}

        //Getters e Setters

Alguma ideia do que possa ser?

Desde já, muito obrigado!

Este erro está acontecendo porque vc está tentando acessar a atributo da classe pessoa dentro de consulta sendo que
a mesmo não existe.

Basta fazer o mapeamento de pessoa em consulta.

Fala Daniel!

Mas eu vou conseguir pegar o Médico e o Paciente se eu mapear ele em consulta??
Pois Pessoa está mapeado em Médico e Pessoa. E não tem mapeamento de Médico e Paciente em Pessoa.

Classe Médico:

@Entity
public class Medico {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_medico")
	private Long id;
	
	private String crm;
	
	@ManyToOne
	@JoinColumn(name = "id_especialidade")
	private Especialidade especialidade;
	
	@OneToOne(orphanRemoval = true, cascade = CascadeType.ALL)
	@JoinColumn(name = "id_pessoa")
	private Pessoa pessoa;
	
	@OneToMany(mappedBy = "medico", orphanRemoval = true, cascade = CascadeType.ALL)
	private List<AgendaConsulta> agendamentos;

	public Medico(Long id, String crm, Especialidade especialidade,
			Pessoa pessoa, List<AgendaConsulta> agendamentos) {
		super();
		this.id = id;
		this.crm = crm;
		this.especialidade = especialidade;
		this.pessoa = pessoa;
		this.agendamentos = agendamentos;
	}

	public Medico() {}
// Getters e Setters

Classe Paciente:

@Entity
public class Paciente {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_paciente")
	private Long id;
	
	@ManyToOne
	@JoinColumn(name = "id_convenio")
	private Convenio convenio;
	
	@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinColumn(name = "id_pessoa")
	private Pessoa pessoa;
	
	@OneToMany(mappedBy = "paciente")
	private List<Consulta> consultas;

	public Paciente(Long id, Convenio convenio, Pessoa pessoa, 
			List<Consulta> consultas) {
		super();
		this.id = id;
		this.convenio = convenio;
		this.pessoa = pessoa;
		this.consultas = consultas;
	}

	public Paciente() {}
// Getters e Setters

Classe Pessoa:

@Entity
public class Pessoa implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_pessoa")
	private Long id;
	
	private String nome;
	private String cpf;
	private String identidade;
	
	@Temporal(TemporalType.DATE)
	@DateTimeFormat(pattern = "dd/MM/yyyy")
	@Column(name = "data_nascimento")
	private Date dataNascimento;
	
	private String endereco;
	private String complemento;
	private String cidade;
	private String estado;
	private String pais;
	private String cep;
	private String telefone;
	private String celular;
	private String email;

	public Pessoa(Long id, String nome, String cpf, String identidade,
			Date dataNascimento, String endereco, String complemento,
			String cidade, String estado, String pais, String cep,
			String telefone, String celular, String email) {
		super();
		this.id = id;
		this.nome = nome;
		this.cpf = cpf;
		this.identidade = identidade;
		this.dataNascimento = dataNascimento;
		this.endereco = endereco;
		this.complemento = complemento;
		this.cidade = cidade;
		this.estado = estado;
		this.pais = pais;
		this.cep = cep;
		this.telefone = telefone;
		this.celular = celular;
		this.email = email;
	}

	public Pessoa() {}
// Getters e Setters

Mas mesmo assim vou tentar aqui, e posto!

Abraços!

Tenta assim:

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List&lt;Consulta&gt; buscaConsultas(Consulta consulta) {
		Criteria crit = session.createCriteria(Consulta.class)
		.createAlias("paciente", "p")
		.createAlias("medico", "m")
		.createAlias("medico.pessoa", "pe");
		Criterion paciente = Restrictions.ilike("p.a.nome", consulta.getPaciente().getPessoa().getNome(), MatchMode.ANYWHERE);
		Criterion medico = Restrictions.ilike("m.a.nome", consulta.getMedico().getPessoa().getNome(), MatchMode.ANYWHERE);
		Conjunction conjunction = Restrictions.conjunction();
		
		if(!consulta.getPaciente().getPessoa().getNome().isEmpty()) {
			conjunction.add(medico);}
		
		if(!consulta.getMedico().getPessoa().getNome().isEmpty()) {
			conjunction.add(paciente);}
		
		crit.add(conjunction);
		List resultados = crit.list();
		return resultados;
	}

E aí Daniel!
Tentei colocar igual você colocou acima mas não deu boa, mas aí adicionei mais um alias pra “paciente.pessoa”, “pp”.

Agora ele não está mais retornando erro, mas também diz que não encontrou nenhum resultado. Sendo que tem uma consulta cadastrada com esses dados.

O método agora está assim:

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List<Consulta> buscaConsultas(Consulta consulta) {
		Criteria crit = session.createCriteria(Consulta.class)
		.createAlias("paciente", "pa")
		.createAlias("medico", "m")
		.createAlias("medico.pessoa", "mp")
		.createAlias("paciente.pessoa", "pp");
		Criterion paciente = Restrictions.ilike("pp.nome", consulta.getPaciente().getPessoa().getNome(), MatchMode.ANYWHERE);
		Criterion medico = Restrictions.ilike("mp.nome", consulta.getMedico().getPessoa().getNome(), MatchMode.ANYWHERE);
		Conjunction conjunction = Restrictions.conjunction();
		
		if(!consulta.getPaciente().getPessoa().getNome().isEmpty()) {
			conjunction.add(medico);}
		
		if(!consulta.getMedico().getPessoa().getNome().isEmpty()) {
			conjunction.add(paciente);}
		
		crit.add(conjunction);
		List resultados = crit.list();
		return resultados;
	}

Me responde uma coisa pode consulta sem o médicos ou pacientes?
Tenta asssim:

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List&lt;Consulta&gt; buscaConsultas(Consulta consulta) {
		Criteria crit = session.createCriteria(Consulta.class)
		.createAlias("paciente", "pa",Criteria.LEFT_JOIN)
		.createAlias("medico", "m",,Criteria.LEFT_JOIN)
		.createAlias("medico.pessoa", "mp",,Criteria.LEFT_JOIN)
		.createAlias("paciente.pessoa", "pp",,Criteria.LEFT_JOIN);
		Criterion paciente = Restrictions.ilike("pp.nome", consulta.getPaciente().getPessoa().getNome(), MatchMode.ANYWHERE);
		Criterion medico = Restrictions.ilike("mp.nome", consulta.getMedico().getPessoa().getNome(), MatchMode.ANYWHERE);
		Conjunction conjunction = Restrictions.conjunction();
		
		if(!consulta.getPaciente().getPessoa().getNome().isEmpty()) {
			conjunction.add(medico);}
		
		if(!consulta.getMedico().getPessoa().getNome().isEmpty()) {
			conjunction.add(paciente);}
		
		crit.add(conjunction);
		List resultados = crit.list();
		return resultados;
	}



Mas antes posta por favor o SQL gerado pela consulta antes de fazer estas alterações que sugeri.

Fala Daniel, o SQL gerado é esse:

Hibernate: 
    select
        this_.id as id29_4_,
        this_.id_agendaconsulta as id4_29_4_,
        this_.data as data29_4_,
        this_.id_medico as id5_29_4_,
        this_.id_paciente as id6_29_4_,
        this_.id_tipopagamento as id7_29_4_,
        this_.preco_consulta as preco3_29_4_,
        m2_.id_medico as id1_23_0_,
        m2_.crm as crm23_0_,
        m2_.id_especialidade as id3_23_0_,
        m2_.id_pessoa as id4_23_0_,
        mp3_.id_pessoa as id1_22_1_,
        mp3_.celular as celular22_1_,
        mp3_.cep as cep22_1_,
        mp3_.cidade as cidade22_1_,
        mp3_.complemento as compleme5_22_1_,
        mp3_.cpf as cpf22_1_,
        mp3_.data_nascimento as data7_22_1_,
        mp3_.email as email22_1_,
        mp3_.endereco as endereco22_1_,
        mp3_.estado as estado22_1_,
        mp3_.identidade as identidade22_1_,
        mp3_.nome as nome22_1_,
        mp3_.pais as pais22_1_,
        mp3_.telefone as telefone22_1_,
        pa1_.id_paciente as id1_24_2_,
        pa1_.id_convenio as id2_24_2_,
        pa1_.id_pessoa as id3_24_2_,
        pp4_.id_pessoa as id1_22_3_,
        pp4_.celular as celular22_3_,
        pp4_.cep as cep22_3_,
        pp4_.cidade as cidade22_3_,
        pp4_.complemento as compleme5_22_3_,
        pp4_.cpf as cpf22_3_,
        pp4_.data_nascimento as data7_22_3_,
        pp4_.email as email22_3_,
        pp4_.endereco as endereco22_3_,
        pp4_.estado as estado22_3_,
        pp4_.identidade as identidade22_3_,
        pp4_.nome as nome22_3_,
        pp4_.pais as pais22_3_,
        pp4_.telefone as telefone22_3_ 
    from
        Consulta this_ 
    inner join
        Medico m2_ 
            on this_.id_medico=m2_.id_medico 
    inner join
        Pessoa mp3_ 
            on m2_.id_pessoa=mp3_.id_pessoa 
    inner join
        Paciente pa1_ 
            on this_.id_paciente=pa1_.id_paciente 
    inner join
        Pessoa pp4_ 
            on pa1_.id_pessoa=pp4_.id_pessoa 
    where
        (
            lower(mp3_.nome) like ? 
            and lower(pp4_.nome) like ?
        )
Hibernate: 
    select
        especialid0_.id_especialidade as id1_26_0_,
        especialid0_.nome_especialidade as nome2_26_0_ 
    from
        Especialidade especialid0_ 
    where
        especialid0_.id_especialidade=?
Hibernate: 
    select
        convenio0_.id_convenio as id1_25_0_,
        convenio0_.nome_convenio as nome2_25_0_ 
    from
        Convenio convenio0_ 
    where
        convenio0_.id_convenio=?

Então… Uma consultan não pode existir se não tiver um médico e um paciente… todas os campos são validados!

[]s

Daniel, tentei colocar o Criteria.LEFT_JOIN.
Ainda continua na mesma.

Quando vc joga este SQL direto no banco retorna algum resultado

  select
        this_.id as id29_4_,
        this_.id_agendaconsulta as id4_29_4_,
        this_.data as data29_4_,
        this_.id_medico as id5_29_4_,
        this_.id_paciente as id6_29_4_,
        this_.id_tipopagamento as id7_29_4_,
        this_.preco_consulta as preco3_29_4_,
        m2_.id_medico as id1_23_0_,
        m2_.crm as crm23_0_,
        m2_.id_especialidade as id3_23_0_,
        m2_.id_pessoa as id4_23_0_,
        mp3_.id_pessoa as id1_22_1_,
        mp3_.celular as celular22_1_,
        mp3_.cep as cep22_1_,
        mp3_.cidade as cidade22_1_,
        mp3_.complemento as compleme5_22_1_,
        mp3_.cpf as cpf22_1_,
        mp3_.data_nascimento as data7_22_1_,
        mp3_.email as email22_1_,
        mp3_.endereco as endereco22_1_,
        mp3_.estado as estado22_1_,
        mp3_.identidade as identidade22_1_,
        mp3_.nome as nome22_1_,
        mp3_.pais as pais22_1_,
        mp3_.telefone as telefone22_1_,
        pa1_.id_paciente as id1_24_2_,
        pa1_.id_convenio as id2_24_2_,
        pa1_.id_pessoa as id3_24_2_,
        pp4_.id_pessoa as id1_22_3_,
        pp4_.celular as celular22_3_,
        pp4_.cep as cep22_3_,
        pp4_.cidade as cidade22_3_,
        pp4_.complemento as compleme5_22_3_,
        pp4_.cpf as cpf22_3_,
        pp4_.data_nascimento as data7_22_3_,
        pp4_.email as email22_3_,
        pp4_.endereco as endereco22_3_,
        pp4_.estado as estado22_3_,
        pp4_.identidade as identidade22_3_,
        pp4_.nome as nome22_3_,
        pp4_.pais as pais22_3_,
        pp4_.telefone as telefone22_3_ 
    from
        Consulta this_ 
    inner join
        Medico m2_ 
            on this_.id_medico=m2_.id_medico 
    inner join
        Pessoa mp3_ 
            on m2_.id_pessoa=mp3_.id_pessoa 
    inner join
        Paciente pa1_ 
            on this_.id_paciente=pa1_.id_paciente 
    inner join
        Pessoa pp4_ 
            on pa1_.id_pessoa=pp4_.id_pessoa 
    where
        (
            lower(mp3_.nome) like ? 
            and lower(pp4_.nome) like ?
        )

ué, mas se eu jogar isso no sgbd ele vai conseguir ler??
achei que isso fosse hql!

Isto que é mandei executar no BD é sql, HQL é uma coisa similar ao criteria.
Este é o sql gerado pelo Hibernate, vc que jogar assim

  select
        this_.id as id29_4_,
        this_.id_agendaconsulta as id4_29_4_,
        this_.data as data29_4_,
        this_.id_medico as id5_29_4_,
        this_.id_paciente as id6_29_4_,
        this_.id_tipopagamento as id7_29_4_,
        this_.preco_consulta as preco3_29_4_,
        m2_.id_medico as id1_23_0_,
        m2_.crm as crm23_0_,
        m2_.id_especialidade as id3_23_0_,
        m2_.id_pessoa as id4_23_0_,
        mp3_.id_pessoa as id1_22_1_,
        mp3_.celular as celular22_1_,
        mp3_.cep as cep22_1_,
        mp3_.cidade as cidade22_1_,
        mp3_.complemento as compleme5_22_1_,
        mp3_.cpf as cpf22_1_,
        mp3_.data_nascimento as data7_22_1_,
        mp3_.email as email22_1_,
        mp3_.endereco as endereco22_1_,
        mp3_.estado as estado22_1_,
        mp3_.identidade as identidade22_1_,
        mp3_.nome as nome22_1_,
        mp3_.pais as pais22_1_,
        mp3_.telefone as telefone22_1_,
        pa1_.id_paciente as id1_24_2_,
        pa1_.id_convenio as id2_24_2_,
        pa1_.id_pessoa as id3_24_2_,
        pp4_.id_pessoa as id1_22_3_,
        pp4_.celular as celular22_3_,
        pp4_.cep as cep22_3_,
        pp4_.cidade as cidade22_3_,
        pp4_.complemento as compleme5_22_3_,
        pp4_.cpf as cpf22_3_,
        pp4_.data_nascimento as data7_22_3_,
        pp4_.email as email22_3_,
        pp4_.endereco as endereco22_3_,
        pp4_.estado as estado22_3_,
        pp4_.identidade as identidade22_3_,
        pp4_.nome as nome22_3_,
        pp4_.pais as pais22_3_,
        pp4_.telefone as telefone22_3_ 
    from
        Consulta this_ 
    inner join
        Medico m2_ 
            on this_.id_medico=m2_.id_medico 
    inner join
        Pessoa mp3_ 
            on m2_.id_pessoa=mp3_.id_pessoa 
    inner join
        Paciente pa1_ 
            on this_.id_paciente=pa1_.id_paciente 
    inner join
        Pessoa pp4_ 
            on pa1_.id_pessoa=pp4_.id_pessoa 
    where
        (
            lower(mp3_.nome) like  'Nome que exista no banco'
            and lower(pp4_.nome) like  'Nome que exista no banco'
        )

O poste o sql depois daquela alteração com Left-Join por favor.

Ta assim com o Left_Join. Acho que não teve alterações!

Hibernate: 
    select
        this_.id as id29_4_,
        this_.id_agendaconsulta as id4_29_4_,
        this_.data as data29_4_,
        this_.id_medico as id5_29_4_,
        this_.id_paciente as id6_29_4_,
        this_.id_tipopagamento as id7_29_4_,
        this_.preco_consulta as preco3_29_4_,
        m2_.id_medico as id1_23_0_,
        m2_.crm as crm23_0_,
        m2_.id_especialidade as id3_23_0_,
        m2_.id_pessoa as id4_23_0_,
        mp3_.id_pessoa as id1_22_1_,
        mp3_.celular as celular22_1_,
        mp3_.cep as cep22_1_,
        mp3_.cidade as cidade22_1_,
        mp3_.complemento as compleme5_22_1_,
        mp3_.cpf as cpf22_1_,
        mp3_.data_nascimento as data7_22_1_,
        mp3_.email as email22_1_,
        mp3_.endereco as endereco22_1_,
        mp3_.estado as estado22_1_,
        mp3_.identidade as identidade22_1_,
        mp3_.nome as nome22_1_,
        mp3_.pais as pais22_1_,
        mp3_.telefone as telefone22_1_,
        pa1_.id_paciente as id1_24_2_,
        pa1_.id_convenio as id2_24_2_,
        pa1_.id_pessoa as id3_24_2_,
        pp4_.id_pessoa as id1_22_3_,
        pp4_.celular as celular22_3_,
        pp4_.cep as cep22_3_,
        pp4_.cidade as cidade22_3_,
        pp4_.complemento as compleme5_22_3_,
        pp4_.cpf as cpf22_3_,
        pp4_.data_nascimento as data7_22_3_,
        pp4_.email as email22_3_,
        pp4_.endereco as endereco22_3_,
        pp4_.estado as estado22_3_,
        pp4_.identidade as identidade22_3_,
        pp4_.nome as nome22_3_,
        pp4_.pais as pais22_3_,
        pp4_.telefone as telefone22_3_ 
    from
        Consulta this_ 
    left outer join
        Medico m2_ 
            on this_.id_medico=m2_.id_medico 
    left outer join
        Pessoa mp3_ 
            on m2_.id_pessoa=mp3_.id_pessoa 
    left outer join
        Paciente pa1_ 
            on this_.id_paciente=pa1_.id_paciente 
    left outer join
        Pessoa pp4_ 
            on pa1_.id_pessoa=pp4_.id_pessoa 
    where
        (
            lower(mp3_.nome) like ? 
            and lower(pp4_.nome) like ?
        )
Hibernate: 
    select
        especialid0_.id_especialidade as id1_26_0_,
        especialid0_.nome_especialidade as nome2_26_0_ 
    from
        Especialidade especialid0_ 
    where
        especialid0_.id_especialidade=?
Hibernate: 
    select
        convenio0_.id_convenio as id1_25_0_,
        convenio0_.nome_convenio as nome2_25_0_ 
    from
        Convenio convenio0_ 
    where
        convenio0_.id_convenio=?

Quando vc joga no banco qual o resultado??

Fala Daniel… não entendi muito bem esse lance de jogar no banco não!
Entrei no eclipse e coloquei na perspective de debug… ele retorna um médico e um paciente sim!
Só que não aparece no resultado da busca… achei muito estranho isso…

O que eu teria que jogar no banco! hehehehe malz aí, mas não compreendi muito bem não!

Eu falo de pegar o sql gerado e executar diretamente no banco de dados.

Porque seu código não pode ficar assim?

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List&lt;Consulta&gt; buscaConsultas(Consulta consulta) {
		Criteria crit = session.createCriteria(Consulta.class)
		.createAlias("paciente", "p")
		.createAlias("medico", "m")
		.createAlias("medico.pessoa", "pe");
		Criterion paciente = Restrictions.ilike("p.a.nome", consulta.getPaciente().getPessoa().getNome(), MatchMode.ANYWHERE);
		Criterion medico = Restrictions.ilike("m.a.nome", consulta.getMedico().getPessoa().getNome(), MatchMode.ANYWHERE);
		Conjunction conjunction = Restrictions.conjunction();
		
		if(!consulta.getPaciente().getPessoa().getNome().isEmpty()) {
			crit.add(medico);}
		
		if(!consulta.getMedico().getPessoa().getNome().isEmpty()) {
			crit.add(paciente);}
		
		
		List resultados = crit.list();
		return resultados;
	}

Porque se eu coloco assim, ele diz que não consegue identificar o álias "a"
por causa da linha:

Criterion paciente = Restrictions.ilike([b]"p.a.nome"[/b], consulta.getPaciente().getPessoa().getNome(), MatchMode.ANYWHERE);  
Criterion medico = Restrictions.ilike[b]("m.a.nome"[/b], consulta.getMedico().getPessoa().getNome(), MatchMode.ANYWHERE);  

eu não deveria ter que referenciar ali no Criterion também não?

Sua consulta não poderia ficar assim:

@SuppressWarnings({ "rawtypes", "unchecked" })
	public List&lt;Consulta&gt; buscaConsultas(Consulta consulta) {
		Criteria crit = session.createCriteria(Consulta.class)
		.createAlias("paciente", "p")
		.createAlias("medico", "m")
		.createAlias("medico.pessoa", "pe");
                .createAlias("paciente.pessoa", "pea");
		Criterion paciente = Restrictions.ilike("pe.nome", consulta.getPaciente().getPessoa().getNome(), MatchMode.ANYWHERE);
		Criterion medico = Restrictions.ilike("pea.nome", consulta.getMedico().getPessoa().getNome(), MatchMode.ANYWHERE);
		Conjunction conjunction = Restrictions.conjunction();
		
		if(!consulta.getPaciente().getPessoa().getNome().isEmpty()) {
			crit.add(medico);}
		
		if(!consulta.getMedico().getPessoa().getNome().isEmpty()) {
			crit.add(paciente);}
		
		
		List resultados = crit.list();
		return resultados;
	}



Então Daniel! Ela está assim, só que não retorna valor nenhum =/

Vou colar aqui pra você ver:

@SuppressWarnings({ "rawtypes", "unchecked" })
	public List<Consulta> buscaConsultas(Consulta consulta) {
		Criteria crit = session.createCriteria(Consulta.class)
		.createAlias("paciente", "pa", Criteria.LEFT_JOIN)
		.createAlias("medico", "m", Criteria.LEFT_JOIN)
		.createAlias("medico.pessoa", "mp", Criteria.LEFT_JOIN)
		.createAlias("paciente.pessoa", "pp", Criteria.LEFT_JOIN);
		Criterion paciente = Restrictions.ilike("pp.nome", consulta.getPaciente().getPessoa().getNome(), MatchMode.ANYWHERE);
		Criterion medico = Restrictions.ilike("mp.nome", consulta.getMedico().getPessoa().getNome(), MatchMode.ANYWHERE);
		Conjunction conjunction = Restrictions.conjunction();
		
		if(!consulta.getPaciente().getPessoa().getNome().isEmpty()) {
			conjunction.add(medico);}
		
		if(!consulta.getMedico().getPessoa().getNome().isEmpty()) {
			conjunction.add(paciente);}
		
		crit.add(conjunction);
		List resultados = crit.list();
		return resultados;
	}

Olha o código abaixo:

[code]
@SuppressWarnings({ “rawtypes”, “unchecked” })
public List<Consulta> buscaConsultas(Consulta consulta) {
Criteria crit = session.createCriteria(Consulta.class)
.createAlias(“paciente”, “p”)
.createAlias(“medico”, “m”)
.createAlias(“medico.pessoa”, “pe”);
.createAlias(“paciente.pessoa”, “pea”);
Criterion paciente = Restrictions.ilike(“pe.nome”, consulta.getPaciente().getPessoa().getNome(), MatchMode.ANYWHERE);
Criterion medico = Restrictions.ilike(“pea.nome”, consulta.getMedico().getPessoa().getNome(), MatchMode.ANYWHERE);
Conjunction conjunction = Restrictions.conjunction();

	if(!consulta.getPaciente().getPessoa().getNome().isEmpty()) {
		crit.add(medico);}
	
	if(!consulta.getMedico().getPessoa().getNome().isEmpty()) {
		crit.add(paciente);}
	
	
	List resultados = crit.list();
	return resultados;

}[/code]
Repare que eu tirei o conjuction, seu código não está igual ao meu.