[RESOLVIDO]Dúvida com HQL

Olá pessoa!

Estou com problemas p/ criar uma query com HQL

Tenho um Cenário semelhante a esse

@Entity
public class Pai {

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

	@NotNull
	private String name;

	@OneToMany
	@Cascade(value = { CascadeType.ALL })
	private List<Filho> filhos;

	// ...
}
@Entity
public class Filho {

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

	@NotNull
	@ManyToOne
	private Pai pai;

	@NotNull
	private Integer idade;

	// ...
}

O que eu quero é buscar todos os Pais, mas que tragam junto apenas os filhos com idade = x

vou tentar ser mais claro…

Eu tenho um Pai na minha tabela que tem 3 filhos um desses filhos com 4 anos(que não virá nessa busca) e 2 Filhos (não sei por qual motivo) com 6 anos(Esses dois virão na busca com o pai)

eu quero fazer uma query em HQL que me traga o(s) Pai(s) com filhos de 6 anos!

vlw…

Aqui mostra como fica a sintax: JPA Consultas e Dicas.

você teria que fazer onde idade > 0 já que idade do filho é notnull

Hebert ñ vi nenhum exemplo do tipo.

vc saberia me dizer como ficaria essa query?

[quote=kadu.m.lino]Hebert ñ vi nenhum exemplo do tipo.

vc saberia me dizer como ficaria essa query?[/quote]Lá mostra como deve ficar a sintax e como recuperar o objeto, e eu te falei qual a condição do where…

Só juntar as peças.

Sim, eu cheguei a tentar…

o problema não é nem a condição do where… é a join entre as duas tabelas…

alguém já fez uma query parecida?

Mas no site indicado já pelo Hebert tem o que você quer: http://uaihebert.com/?p=1137&page=4

Eu só posso ajudar sobre Criteria:

List paisComFilhoIdadeX = session.createCriteria(Pai.class) .setFetchMode("filhos", FetchMode.JOIN) //observar SQL e resultado gerado para saber se será necessário esta linha .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) //observar SQL e resultado gerado para saber se será necessário esta linha .add(Restrictions.eq("filhos.idade", X)) .list();

javaflex, vlw pela ajuda… mas a sua query não está certa!

:frowning:

.add(Restrictions.eq("filhos.idade", X))

ñ posso fazer isso…

e no site ho uaiHerbert ñ tem! :frowning:

vlw

[quote=kadu.m.lino]javaflex, vlw pela ajuda… mas a sua query não está certa!

:frowning:

.add(Restrictions.eq("filhos.idade", X))

ñ posso fazer isso…

e no site ho uaiHerbert ñ tem! :frowning:

vlw[/quote]
Qual erro foi exibido? Qual SQL gerado? Por quê não pode fazer isso? Você não queria os pais com filhos de idade = X? É o que está ai, e especifique melhor o que você quer pois no site do Herbert tem o que você falou até agora.

n, eu n devo ter sido muito claro na pergunta…

na verdade eu quero os pais n q tenha filhos com idade = x

mas sim os pais contendo os filhos com idade = x

tendeu?

se eu tenho um pai com n filhos quero que minha query traga o pai com só alguns determinados filhos… não todos!

Esse seria o pai no banco!
Pai :
id = 2
nome = ze
filhos : [filho1, filho2, filho3]

esse seria o Pai que veio da minha consulta
Pai :
id = 2
nome = ze
filhos : [filho1]

pq só o filho1 tem idade = x

ficou mais claro?

vlw

abrass

javaflex, consegui resolver com Filter do hibernate!

com o exemplo que eu dei… ficaria assim!


@Entity
@FilterDef(name = "filterIdade", parameters = @ParamDef(name = "idade", type = "integer"))
public class Pai {

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

	private String name;

	@OneToMany
	@Cascade({ CascadeType.ALL })
	@JoinColumn(name = "pai_id")
	@Filter(name = "filterIdade", condition = "idade > :idade")
	private List<Filho> filhos;
}
@Entity
public class Filho {

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

	private String name;

	private Integer idade;
}
public class PaiDAO {

	private Session session;

	public PaiDAO(Session session) {
		this.session = session;
	}

	public Pai buscaPaiComFilhosDeIdadeMaiorQue(Integer idade, Long id) {
        //habilito o filtro
		session.enableFilter("filterIdade").setParameter("idade", idade);
        //faço a busca normal
		Pai pai = (Pai) session.load(Pai.class, id);
        //desabilito o filtro.
		session.disableFilter("filterIdade");

		return pai;
	}

}
@Test
	public void deveTrazerPaiContendoOsFilhosComIdadeMaiorQue10() {
		Pai pai = new Pai("Pai",
				Arrays.asList(
						new Filho("Filho 1", 10),
						new Filho("Filho 2", 14),
						new Filho("Filho 3", 9)
						)
				);

		session.save(pai);
		session.flush();
		session.clear();

		Pai paiComDeterminadosFilhos = new PaiDAO(session).buscaPaiComFilhosDeIdadeMaiorQue(10, 1L);
		assertEquals(1, paiComDeterminadosFilhos.getFilhos().size());
	}

:slight_smile:

coloquei esse exemplo no git (https://github.com/ricardo-lino/filter_hibernate)… pra quem quiser dar uma olha ou entender melhor o que eu queria! abrasss