2016-11-22 7 views
0

Je fais face au problème ci-dessus lorsque j'essaie de trier en fonction d'un champ incorporé; Par exemple: J'essaie de trier avec la propriété tObservation.raw.waterLevel.metre. Mais obtenir l'exception suivante.org.hibernate.QueryException: Les objets de critères ne peuvent pas être créés directement sur les composants

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) 

Je crée des alias comme; Pourquoi est-ce que je reçois cette exception?

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

Pourquoi je reçois cette exception?

Le code ci-dessus fonctionne pour deux niveaux: par exemple tObservation.id

p.s: Si j'essaie comme, (sans alias)

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

Je reçois même exception.

Ma structure de classe

@Entity 
class tank { 

Observation tObservation; 

} 


@Entity 
class Observation { 

@Embedded 
RawObservation raw; 

} 

@Embeddable 
class RawObservation{ 

    @Embedded 
Length waterLevel; 
} 

@Embeddable 
class Length{ 
BigDecimal metre 

} 

Répondre

0

Utilisez quelque chose comme ça

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

Merci. J'essaierai. Donc, créer des alias est faux dans ce cas? – Ratha

+0

Je ne suis pas sûr. J'ai remarqué une chose cependant. Votre entité Longueur a un champ de compteur mais l'ordre utilise un compteur. Il pourrait aussi être la raison – StanislavL

+0

Je reçois même exception // Causée par: org.hibernate.QueryException: Les objets de critères ne peuvent pas être créés directement sur les composants. Créer un critère sur entité propriétaire et utiliser une propriété en pointillés pour accéder à la propriété des composants: tObservation.raw \t à org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathInfo (CriteriaQueryTranslator.java:251) \t à org.hibernate.loader.criteria .CriteriaQueryTranslator.createCriteriaEntityNameMap (CriteriaQueryTranslator.java:212) \t à org.hibernate.loader.criteria.CriteriaQueryTranslator. (CriteriaQueryTranslator.java:94) // – Ratha

0

Vous pouvez également essayer comme ceci:

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