【问题标题】:org.hibernate.QueryException: Criteria objects cannot be created directly on componentsorg.hibernate.QueryException:不能直接在组件上创建 Criteria 对象
【发布时间】:2016-11-22 04:32:16
【问题描述】:

我在尝试基于嵌入字段进行排序时遇到上述问题;

例如:我尝试使用属性tObservation.raw.waterLevel.metre 进行排序。 但得到以下异常。

Caused by: org.hibernate.QueryException: Criteria objects cannot be created directly on components.  Create a criteria on owning entity and use a dotted property to access component property: tObservation.raw
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathInfo(CriteriaQueryTranslator.java:251)

我创建了类似的别名;

criteria.createAlias("tObservation", "0").createAlias("0.raw","1").createAlias("1.waterLevel","2").addOrder(Order.asc("2.meter"))

为什么我会得到那个异常?

以上代码适用于两个级别 例如:tObservation.id

p.s:如果我尝试喜欢;(没有别名)

criteria.addOrder(Order.asc("tObservation.raw.waterLevel.metre"))

我遇到了同样的异常。

我的班级结构

@Entity
class tank {

Observation tObservation;

}


@Entity
class Observation {

@Embedded
RawObservation raw;

}

@Embeddable
class RawObservation{

    @Embedded
Length waterLevel;
}

@Embeddable
class Length{
BigDecimal metre

}

【问题讨论】:

    标签: hibernate criteria hibernate-criteria


    【解决方案1】:

    使用类似的东西

    Criteria cObservation = criteria.createCriteria("tObservation");
    Criteria cRaw = cObservation.createCriteria("raw");
    Criteria cWaterLevel = cRaw.createCriteria("waterLevel");
    cWaterLevel.addOrder(Order.asc("meter"))
    

    【讨论】:

    • 谢谢。我会尽力。那么,在这种情况下,创建别名是错误的吗?
    • 我不确定。不过我注意到一件事。您的实体长度有米字段,但订单使用米。这也可能是原因
    • 我得到同样的异常 //Caused by: org.hibernate.QueryException: Criteria objects cannot be created directly on components。在拥有实体上创建条件并使用点属性访问组件属性: tObservation.raw at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathInfo(CriteriaQueryTranslator.java:251) at org.hibernate.loader.criteria.CriteriaQueryTranslator.createCriteriaEntityNameMap (CriteriaQueryTranslator.java:212) 在 org.hibernate.loader.criteria.CriteriaQueryTranslator.(CriteriaQueryTranslator.java:94) //
    • 这适用于关联,但不适用于嵌入属性
    【解决方案2】:

    你也可以这样试试:

    Criteria cObserv = criteria.createCriteria("tObservation");
    cObserv.createAlias("raw", "r");
    cObserv.createAlias("r.waterLevel", "rw");
    
    cObserv.createAlias("rw.metre", "rwm");
    or
    cObserv.setFetchMode("rw.metre", FetchMode.JOIN);
    
    cObserv.addOrder(Order.asc("rw.metre"))
    

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 2015-06-13
      • 2012-11-04
      • 2012-12-28
      • 2022-07-04
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      相关资源
      最近更新 更多