Dificuldade em criar consulta sql JPA

Galera, é o seguinte, tenho essas tabelas no meu BD:

@Entity
@Table(name="paciente")
public class Paciente implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	private int id;
	private String endereco;
	private String nome;
	@Column(name="nome_mae")
	private String nomeMae;

	//bi-directional many-to-one association to Historico
	@OneToMany(mappedBy="paciente")
	private List<Historico> historicos;

	//bi-directional many-to-many association to Vacina
	@ManyToMany(cascade={CascadeType.MERGE})
	@JoinTable(name="historico", 
			joinColumns={@JoinColumn(name="fk_paciente")}		
		, inverseJoinColumns={
			@JoinColumn(name="fk_vacina")
			}
		)
	private List<Vacina> vacinas;
@Entity
@Table(name="vacina")
public class Vacina implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	private int id;

	private String nome;

	//bi-directional many-to-one association to Historico
	@OneToMany(mappedBy="vacina")
	private List<Historico> historicos;

	//bi-directional many-to-many association to Paciente
	@ManyToMany(mappedBy="vacinas", cascade={CascadeType.MERGE})
	private List<Paciente> pacientes;

	//bi-directional many-to-many association to Dos
    @ManyToMany
	@JoinTable(
		name="historico"
		, joinColumns={
			@JoinColumn(name="fk_vacina")
			}
		, inverseJoinColumns={
			@JoinColumn(name="fk_doses")
			}
		)
	private List<Dos> doses;
}
@Entity
@Table(name="doses")
public class Dos implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;

	private String descricao;

	//bi-directional many-to-one association to Historico
	@OneToMany(mappedBy="dos")
	private List<Historico> historicos;

	//bi-directional many-to-many association to Vacina
	@ManyToMany(mappedBy="doses")
	private List<Vacina> vacinas;
}
@Entity
@Table(name="historico")
public class Historico implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	private int id;

    @Temporal( TemporalType.DATE)
	private Date data;

	//bi-directional many-to-one association to Paciente
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="fk_paciente")
	private Paciente paciente;

	//bi-directional many-to-one association to Dos
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="fk_doses")
	private Dos dos;

	//bi-directional many-to-one association to Vacina
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="fk_vacina")
	private Vacina vacina;

Minha dúvida é, preciso de fazer uma pesquisa no banco de dados, pra me retornar todas as doses, data da tabela historico onde o nome da vacina=x e o nome do paciente=y, nesse caso ele irá me retornar uma list. tô apanhando pra caramba

A maneira mais fácil seria usando o CreateSQLQuery. Além de ser mais fácil devido ao fato de você pode usar sql nativo é mais rápido na execução, com apenas uma desvantagem: Dependendo da consulta ela vai ficar volta apenas para um certo banco de dados.

Exemplo:

List lst;
lst = sessao.createSQLQuery("select pc.nome, vc.nome as nomevacina, ds.descricao as descricaodose, hi.data as datadose “+
” from paciente pc “+
” left join historico hi on (hi.id = ps.historico) “+
” left join dose ds on (ds.id = ps.dos) “+
” left join vacina vc on (vs.id = ps.vacina) “+
” where hi.data = '01/01/2011’sql).list();

Obsevação: verifique quais são os campos nas tabelas do banco que esteja fazendo a relação entre as tabelas para especificar corretamente
nos join.