Como pesquisar objeto de outra classe (composição) utilizando JPA ?

package erp.agenda.evento.tipoevento;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PersistenceContext;

import erp.agenda.evento.Evento;

@SuppressWarnings("serial")
@PersistenceContext(unitName = "erp")
@Entity
public class TipoEvento implements Serializable {
	@Id
	@GeneratedValue
	private Long id;
	@Column(length = 50)
	private String nome;

	public Long getId() {
		return this.id;
	}

	public String getNome() {
		return this.nome;
	}

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

	public void setNome(String nome) {
		this.nome = nome;
	}

	@Override
	public String toString() {
		return this.nome;
	}
	
	@Override
	public boolean equals(Object object) {
		if (!(object instanceof Evento)) {
			return false;
		}
		if (((TipoEvento) object).getId() == this.id) {
			return true;
		}
		return false;
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package erp.agenda.evento;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.PersistenceContext;

import erp.agenda.evento.tipoevento.TipoEvento;

@SuppressWarnings("serial")
@PersistenceContext(unitName = "erp")
@Entity
public class Evento implements Serializable {
	@Id
	@GeneratedValue
	private Long id;
	@Column(length = 50)
	private String descricao;
	@Column(length = 10)
	private String data;
	@Column(length = 5)
	private String horaInicio;
	@Column(length = 5)
	private String horaTermino;
	@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
	private TipoEvento tipoEvento;

	public Long getId() {
		return id;
	}

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

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
	}

	public String getHoraInicio() {
		return horaInicio;
	}

	public void setHoraInicio(String horaInicio) {
		this.horaInicio = horaInicio;
	}

	public String getHoraTermino() {
		return horaTermino;
	}

	public void setHoraTermino(String horaTermino) {
		this.horaTermino = horaTermino;
	}

	public TipoEvento getTipoEvento() {
		return tipoEvento;
	}

	public void setTipoEvento(TipoEvento tipoEvento) {
		this.tipoEvento = tipoEvento;
	}

	@Override
	public String toString() {
		return this.descricao;
	}

	@Override
	public boolean equals(Object object) {
		if (!(object instanceof Evento)) {
			return false;
		}
		if (((Evento) object).getId() == this.id) {
			return true;
		}
		return false;
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package erp.agenda.evento;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import arquitetura.JPA;

final class EventoDaoImp implements EventoDao {
	@Override
	public Collection<Evento> pesquisarRegistro(Evento evento) {
		EntityManager entityManager = JPA.getEntityManagerFactory().createEntityManager();
		EntityTransaction tx = entityManager.getTransaction();
		tx.begin();

		CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
		CriteriaQuery<Evento> criteriaQuery = criteriaBuilder.createQuery(Evento.class);
		Root<Evento> rootEvento = criteriaQuery.from(Evento.class);

		List<Predicate> predicates = new ArrayList<Predicate>();

		if (evento.getId() != null) {
			predicates.add(criteriaBuilder.equal(rootEvento.get("id"), evento.getId()));
		}
		if (evento.getData() != null && !evento.getData().equals("")) {
			predicates.add(criteriaBuilder.like(rootEvento.get("data"), "%" + evento.getData() + "%"));
		}
		if (evento.getDescricao() != null && !evento.getDescricao().equals("")) {
			predicates.add(criteriaBuilder.like(rootEvento.get("descricao"), "%" + evento.getDescricao() + "%"));
		}
		if (evento.getHoraInicio() != null && !evento.getHoraInicio().equals("")) {
			predicates.add(criteriaBuilder.like(rootEvento.get("horaInicio"), "%" + evento.getHoraInicio() + "%"));
		}
		if (evento.getHoraTermino() != null && !evento.getHoraTermino().equals("")) {
			predicates.add(criteriaBuilder.like(rootEvento.get("horaTermino"), "%" + evento.getHoraTermino() + "%"));
		}
		if (evento.getTipoEvento() != null && evento.getTipoEvento().getId() != null) {
			predicates.add(criteriaBuilder.equal(rootEvento.get("tipoEvento"), evento.getTipoEvento())); // como altero esta linha para pesquisar o objeto que está dentro de outro 
			System.out.println(evento.getTipoEvento().getId());
		}
		
		criteriaQuery.select(rootEvento).where(predicates.toArray(new Predicate[] {}));

		List<Evento> list = entityManager.createQuery(criteriaQuery).getResultList();
		tx.commit();
		entityManager.close();
		return list;
	}
}
// como faço para pesquisar o objeto tipoEvento que está dentro de evento ?