Udelejte to zhruba takto:
DetachedCriteria subquery =
DetachedCriteria.forClass(Load.class, "l");
subquery.add( Restrictions.eqProperty("l.objectA.id", "a.id"))
.add(Restrictions.le("l.validFrom",fromDate)
.setProjection( Property.forName("l.id"));
Criteria criteria = session.createCriteria(ObjectA.class, "a")
.add( Subqueries.exists( subquery) );
A to same v HQL:
from ObjectA a where exists ( select l.id from a.loads l where
l.validFrom<=:fromDate)
nebo
from ObjectA a where :fromDate <= any ( select l.validFrom from a.loads l)
Lukas
Ivan Polák wrote:
toto je v poriadku:
Criteria dateValidCriteria = session.createCriteria(ObjectA.class).
setFetchMode("loads", FetchMode.SELECT).
setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
ale ked tam pridam subqueries (podmienka na asociovane objekty je
disjunction):
Criteria dateValidCriteria = session.createCriteria(ObjectA.class).
setFetchMode("loads", FetchMode.SELECT).
createCriteria("loads").
add(disjunction) .
setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
tak toto nefunguje.
Ivan
Ivan Polák wrote / napísal(a):
dakujem, dakujem, dakujem, to je ono.
velka vdaka.
Ivan
Lukas Barton wrote / napísal(a):
Prominte, mam v tom chybu, prohodil jsem si konstanty (dobre ze uz
EAGER deprekovali a misto neho je jasnejsi JOIN).
Dejte tam FetchMode.SELECT.
Jinak pro podminky na asociacovane objekty musite pouzivat Subqueries.
Ale je v tom hodne bugu a moc to nefunguje -
http://opensource.atlassian.com/projects/hibernate/secure/IssueNavigator.jspa?reset=true&&pid=10031&query=Subqueries+&summary=true&description=true&body=true&status=1&status=3&status=4
Takze radeji pouzijte HQL s exists nebo SQL podminku prilepenou do
criteria.
Lukas
Ivan Polák napsal(a):
nepomohlo ani to, nie je nejaky problem v anotaciach ?
objektA obsahuje:
@OneToMany(mappedBy = "objectA", fetch = FetchType.LAZY, cascade =
CascadeType.ALL)
@JoinColumn(name = "owner_id")
private List<Load> loads;
a objekt Load:
@ManyToOne (fetch = FetchType.LAZY)
@JoinColumn(name = "owner_id", referencedColumnName = "id",
nullable = false)
private ObjectA objectA;
Ja bych to napsal takto, bez toho transformeru - ten totiz bez az
v pameti - nepreklada se do sql.
Criteria dateValidCriteria = session.createCriteria(ObjectA.class).
setFetchMode("loads", FetchMode.EAGER);
Lukas