Montar consulta JPQL aninhada

5 respostas
M

galera tô pagando pau aqui pra poder aninhar uma consulta utilizando jpa. Tenho uma tabela paciente (id,nome,endereco…), tabela dose(id,nome), tabela vacina(id,nome). A consulta abaixo ta funcionando blzinha. ela me retorna todos os registros dos pacientes que tomaram uma determinada dose de uma vacina. só que agora eu quero aninhá-la dentro de uma outra consulta, pra me retornar todos os registros na mesma faixa de idade que não tomaram a tal vacina ou seja, todos os registros menos os registros da primeira consulta.

int codigo=1;
int idade=2;
Query q= em.createQuery("select h from Historico h where h.vacina.id= ?1 and h.dos.nome= :nome and (YEAR(CURDATE())-YEAR(h.paciente.DataNasc))= ?2");

q.setParameter(1, codigo);		
q.setParameter(2,idade);
q.setParameter("nome",nome);

Por favor, quem puder me ajudar, eu agradeço muito!

5 Respostas

M

ah ta! já ia me esquecendo, segue abaixo, a minha tabela Historico que faz o relacionamento da minhas 3 tabelas

public class Historico {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;

	private Date data;


	@ManyToOne(cascade={CascadeType.MERGE}, fetch=FetchType.LAZY)
	@JoinColumn(name="fk_paciente")
	private Paciente paciente;

	@ManyToOne(cascade={CascadeType.MERGE}, fetch=FetchType.LAZY)
	@JoinColumn(name="fk_vacina")
	private Vacina vacina;

	@ManyToOne(cascade={CascadeType.MERGE}, fetch=FetchType.LAZY)
	@JoinColumn(name="fk_dose")
	private Dose dos;
}
fabiocsilva

Tem várias formas de fazer. Por exemplo:

select h from Historico where h.id not in ( select h.id from Historico h where h.vacina.id= ?1 and h.dos.nome= :nome and (YEAR(CURDATE())-YEAR(h.paciente.DataNasc))= ?2 )

M

amigo, antes de mais nada obrigado pela dica mas olha só, fiz do jeito q vc me orientou porém ta dando esse erro aqui:

java.lang.object; cannot be cast to entidades.historico.

inclusive, fiz a mesma consulta utilizando createNativeQuery usando sql puro (select *from historico where historico.id not in(2))

dá o mesmo erro cara.

c sabe o que q é q ta pegando?

fabiocsilva

Cola o log aí, acho que deu erro na passagem de parâmetros e não na consulta.

Sesshoumaru

Kara vc conseguiu resolver seu problema com datas?
estou com a mesma duvida:

String jpql = "select e from Entidade e" + " where YEAR(e.data) = ?"
o codigo acima retorna

função year(date) não existe

Criado 23 de maio de 2011
Ultima resposta 29 de jun. de 2011
Respostas 5
Participantes 3