org.hibernate.QueryException: Criteria objects cannot be created directly on components

纵然是瞬间 提交于 2019-12-25 04:27:44

问题


I face above issue when try to sort based on an embedded field;

eg: I try to sort with the property tObservation.raw.waterLevel.metre. But getting following exception.

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)

I create aliases like;

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

Why I get that exception?

The above code is working for two levels eg: tObservation.id

p.s: If I try like;(without aliases)

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

I get same exception.

My class structure

@Entity
class tank {

Observation tObservation;

}


@Entity
class Observation {

@Embedded
RawObservation raw;

}

@Embeddable
class RawObservation{

    @Embedded
Length waterLevel;
}

@Embeddable
class Length{
BigDecimal metre

}

回答1:


Use something like this

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



回答2:


You can also try like this :

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"))


来源:https://stackoverflow.com/questions/40733812/org-hibernate-queryexception-criteria-objects-cannot-be-created-directly-on-com

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!