本文介绍了org.hibernate.QueryException:不能直接在组件上创建条件对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在尝试根据嵌入字段进行排序时遇到以上问题;例如:我尝试使用属性 tObservation.raw进行排序.waterLevel.metre
。
但得到异常。
引起:org.hibernate.QueryException:无法直接在组件上创建条件对象。在拥有实体上创建条件并使用点属性访问组件属性:tObservation.raw
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathInfo(CriteriaQueryTranslator.java:251)
$ c
我创建了别名;
createAlias(1.waterLevel,2).addOrder(Order.asc(2.meter)。createAlias(tObservation,0 ))
为什么我得到这个异常?
上面的代码工作在两个级别
例如: tObservation.id
ps:If我尝试像;(没有别名)
criteria.addOrder(Order.asc(tObservation.raw.waterLevel.metre) )
我得到同样的例外。
我的课堂结构
@Entity
class tank {
Observation tObservation;
}
@实体
类观察{
@Embedded
RawObservation raw;
}
@Embeddable
class RawObservation {
@Embedded
长度waterLevel;
}
@Embeddable
class长度{
BigDecimal米
}
解决方案您也可以尝试这样:
标准cObserv = criteria.createCriteria(tObservation);
cObserv.createAlias(raw,r);
cObserv.createAlias(r.waterLevel,rw);
cObserv.createAlias(rw.metre,rwm);
或
cObserv.setFetchMode(rw.metre,FetchMode.JOIN);
cObserv.addOrder(Order.asc(rw.metre))
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 levelseg: 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
}
解决方案 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"))
这篇关于org.hibernate.QueryException:不能直接在组件上创建条件对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!