2010-02-23 23 views
6

In diesem Beispiel com.test.Cat erweitert com.test.Animal und es gibt kein Feld DB in CAT Tabelle von com.test.Cat explizit seinen Typ definieren (es war ich nicht).JPA/Hibernate-Abfrage mit Klassenname?

Wenn ich meine Tiere von DB abfrage bekomme ich eine Sammlung von Tieren.

Es ist möglich, sie von Klassennamen zu sortieren:

order by r.class 

aber ist es eine Möglichkeit, Klassennamen als Kriterium zu verwenden? Zum Beispiel möchte ich, dass alle Tiere Hunde erwarten. Aber kein Glück - auch dies nicht funktioniert:

where r.class = ?  (String "ccc.test.Cat") 

als ich eine Ausnahme erhalten:

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 
    at org.hibernate.type.IntegerType.set(IntegerType.java:64) 
    at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:154) 
    at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:136) 
    at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:62) 
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:514) 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1589) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:696) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
    at org.hibernate.loader.Loader.doList(Loader.java:2228) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125) 
    at org.hibernate.loader.Loader.list(Loader.java:2120) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361) 
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:67) 
+0

Können Sie die Klassen- und Tabellendefinitionen veröffentlichen? –

Antwort

6

Nach der chapter 14.9 der Dokumentation, sollten Sie nicht doppelte Anführungszeichen verwenden:

Die spezielle Eigenschaft Klasse greift auf der Diskriminator Wert einer Instanz im Falle von polymorphe Persistenz. Ein in die where-Klausel eingebetteter Java-Klassenname wird in seinen Diskriminatorwert übersetzt.

from Cat cat where cat.class = DomesticCat 
+0

Danke, ich habe das Beispiel behoben. Der ursprüngliche Code verwendet '?' für vorbereitete Aussage. –

+0

@Petteri Ich habe gerade diese HQL-Abfrage getestet und es funktioniert wie erwartet (ohne Anführungszeichen oder doppelte Anführungszeichen). Es ist kein 'String', der erwartet wird, nicht sicher, ob Sie hier eine vorbereitete Anweisung verwenden können (zumindest nicht mit' setString') –

+0

Ja, das funktioniert auch hier. Danke vielmals! –