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













Odpovedet emailem