2016-11-22 5 views
0

埋め込みフィールドに基づいてソートしようとすると、上記の問題が発生します。org.hibernate.QueryException:コンポーネント上に直接条件オブジェクトを作成できない

例:プロパティ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 

} 

答えて

0

使用あなたはまた、次のように試すことができます。この

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

感謝を。私が試してみます。だから、この場合エイリアスを作成するのは間違っていますか? – Ratha

+0

わかりません。私は1つのことに気づいた。エンティティの長さにはメーターフィールドがありますが、オーダーはメーターを使用しますそれはまた、理由がある可能性があります – StanislavL

+0

私は同じ例外が発生した//原因:org.hibernate.QueryException:コンポーネント上で直接Criteriaオブジェクトを作成することはできません。エンティティの所有に関する基準を作成し、点線のプロパティを使用してコンポーネントのプロパティにアクセスします。tObservation.raw \t at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathInfo(CriteriaQueryTranslator.java:251) \t at org.hibernate.loader.criteria .CriteriaQueryTranslator.createCriteriaEntityNameMap(CriteriaQueryTranslator.java:212) \t at org.hibernate.loader.criteria.CriteriaQueryTranslator。 (CriteriaQueryTranslator.java:94) // – Ratha

0

のようなもの:

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")) 
関連する問題