2012-03-26 10 views
2

Ich habe ein ziemlich komplexes Kriterium, mit dem ich serverseitige Daten abrufen, sortieren und anzeigen kann. Ich abgespeckte den folgenden Auszug:Hibernate Criteria API - Zugriff auf verknüpfte Eigenschaften

// create criteria over a bunch of tables... 
    Criteria testCriteria = getSession().createCriteria(PriceRequest.class) 
      .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
      .setFetchMode("pricedBy", FetchMode.JOIN) 
      .setFetchMode("canceledBy", FetchMode.JOIN) 
      .setFetchMode("product", FetchMode.JOIN) 
      .setFetchMode("product.underlyings", FetchMode.JOIN) 
      .setFetchMode("product.tradedBy", FetchMode.JOIN) 
      .setFetchMode("product.requestedBy", FetchMode.JOIN) 
      .setFetchMode("fileUploads", FetchMode.JOIN); 

    // add various filter fields (only if required in real code)... 
     Criteria subCriteria = testCriteria 
       .createCriteria("product", JoinFragment.LEFT_OUTER_JOIN) 
       .setFetchMode("underlyings", FetchMode.JOIN) 
       .add(Restrictions.ge("maturityDate", new Date())); 

     testCriteria.addOrder(Order.desc("product.id")); // (1) 
     testCriteria.addOrder(Order.desc("product.maturityDate")); // (2) 

     List list = testCriteria.list(); 

Statement (1) läuft gut, Aussage (2) mit folgenden Ausnahme endet:

SCHWERE: Servlet.service() für Servlet Rest warf Ausnahme org.hibernate.QueryException: kann nicht Eigentum beheben: product.maturityDate von: com.my.model.PriceRequest

ich nehme „maturityDate“ als Beispiel, aber ich habe diese Fragen mit allen Produkten Eigenschaften außer "product.id".

Ich habe auch versucht, einen Alias ​​für Produkt ("prod") hinzuzufügen. Dies ermöglicht eine Sortierung nach dem Fälligkeitsdatum ("prod.maturityDate"), scheitert jedoch daran, die Einschränkung zu Teilkriterien hinzuzufügen.

Ich haben so viel keine Ahnung, was falsch läuft ...

+0

Ist die Eigenschaft ** maturityDate ** in ** Produkt ** vorhanden? – ManuPK

+0

absolut. Siehe mein Update im Text. –

Antwort

2

createCriteria (Verein) keine Alias ​​erstellen, aber Sie müssen eine für die orderby

Auch Sie schrägen Filter auf einer Vereinigung und eifrig holen weil Sie Entitäten der Assoziation herausfiltern können, die zur Initialisierung benötigt werden, daher wird der Fetchmode ignoriert. Verwenden Sie eine korrelierte Unterabfrage

// create criteria over a bunch of tables... 
Criteria testCriteria = getSession().createCriteria(PriceRequest.class) 
     .setFetchMode("pricedBy", FetchMode.JOIN) 
     .setFetchMode("canceledBy", FetchMode.JOIN) 
     .createAlias("product", "prod") 
     .setFetchMode("prod.underlyings", FetchMode.JOIN) 
     .setFetchMode("prod.tradedBy", FetchMode.JOIN) 
     .setFetchMode("prod.requestedBy", FetchMode.JOIN) 
     .setFetchMode("fileUploads", FetchMode.JOIN) 
     .addOrder(Order.desc("prod.maturityDate"));  // (2) 

// add various filter fields (only if required in real code)... 
if (...) 
{ 
    Criteria subCriteria = getSession().createCriteria(PriceRequest.class) 
     .createCriteria("product", JoinFragment.LEFT_OUTER_JOIN) 
     .add(Restrictions.ge("maturityDate", new Date())); 
     .setResultTransformer(Projection.id) 

    testCriteria = testCriteria 
     .add(Subqueries.PropertyIn("id", subCriteria)); 
     .setFetchMode("underlyings", FetchMode.JOIN) 
} 

List list = testCriteria.list(); 
+0

@Fito, können Sie einen Blick in diese SO: http://StackOverflow.com/questions/25841292/hibernate-fetching-in-criteria-ignored – vlio20