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!

.add(Restrictions.eq("filhos.idade", X))
ñ posso fazer isso…
e no site ho uaiHerbert ñ tem! 
vlw
[quote=kadu.m.lino]javaflex, vlw pela ajuda… mas a sua query não está certa!

.add(Restrictions.eq("filhos.idade", X))
ñ posso fazer isso…
e no site ho uaiHerbert ñ tem! 
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());
}

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