【问题标题】:Hibernate Criteria API - accessing joined propertiesHibernate Criteria API - 访问连接的属性
【发布时间】:2012-04-09 23:03:02
【问题描述】:

我有一个相当复杂的标准,用于检索、排序和分页服务器端数据。我摘录了以下摘录:

    // 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() for servlet rest 抛出异常 org.hibernate.QueryException:无法解析属性: product.maturityDate of: com.my.model.PriceRequest

我选择了“maturityDate”作为示例,但除了“product.id”之外的所有产品属性都存在此问题。

我还尝试为产品添加别名(“prod”)。这允许按到期日期(“prod.maturityDate”)排序,但无法将限制添加到子条件。

我完全不知道出了什么问题......

【问题讨论】:

  • maturityDate 属性是否存在于 product 中?
  • 绝对。在文本中查看我的更新。

标签: hibernate hibernate-criteria


【解决方案1】:

createCriteria(association) 不会创建别名,但您需要一个别名用于 orderby

您也不能过滤关联并急切获取它,因为您可能会过滤掉初始化它所需的关联实体,因此忽略获取模式。使用相关子查询

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2018-03-15
  • 2011-01-16
  • 1970-01-01
相关资源
最近更新 更多