2012-03-26 88 views
2

我有一個相當複雜的標準,我用它來檢索,排序和頁面服務器端數據。我剝了下來以下摘錄:Hibernate Criteria API - 訪問加入的屬性

// 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(); 

聲明(1)運行正常,說明(2)但下列情況除外結束:

重度:Servlet.service()用於servlet的休息拋出異常 org.hibernate.QueryException:無法解析屬性: product.maturityDate的:com.my.model.PriceRequest

我拿起「maturityDate」作爲一個例子,但我有所有的產品這個問題屬性除「product.id」外。

我也嘗試添加產品的別名(「prod」)。這允許按到期日期(「prod.maturityDate」)進行排序,但無法將限制添加到子標準。

我這麼多不知道出現了什麼問題?

+0

屬性** maturityDate **是否存在於**產品**內? – ManuPK 2012-03-26 13:23:23

+0

絕對。在文本中查看我的更新。 – 2012-03-26 13:34:57

回答

2

個createCriteria(協會)不創建別名,但你需要一個爲排序依據的關聯,並渴望獲取

而且你不能過濾器因爲你可能會過濾掉需要初始化它的關聯實體,因此fetchmode被忽略。使用相關的子查詢

// 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,你可以看看這個SO:http://stackoverflow.com/questions/25841292/hibernate-fetching-in-criteria-ignored – vlio20 2014-09-19 18:53:46