2012-03-26 47 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