2010-02-23 11 views
6

En este ejemplo com.test.Cat se extiende com.test.Animal y no hay campo DB en CAT tabla de com.test.Cat definiendo explícitamente su tipo (no era yo).Pregunta de JPA/Hibernate con nombre de clase?

Cuando consulto mis animales de DB obtengo una colección de Animales.

Es posible clasificarlos por nombre de clase:

order by r.class 

pero ¿hay una manera de utilizar el nombre de clase como criterio? Por ejemplo, me gustaría obtener todos los animales esperan perros. Pero no hubo suerte - aunque esto no funciona:

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

como consigo una excepción:

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

¿Podría publicar las definiciones de clase y tabla? –

Respuesta

6

De acuerdo con la chapter 14.9 de la documentación, no se debe utilizar comillas dobles:

La clase de propiedad especial tiene acceso a el valor del discriminador de una instancia en el caso de persistencia polimórfica . Un nombre de clase Java incrustado en la cláusula where será traducido a su valor discriminador.

from Cat cat where cat.class = DomesticCat 
+0

Gracias, he reparado el ejemplo. El código original usado '?' para la declaración preparada. –

+0

@Petteri Acabo de probar esta consulta HQL y funciona como se esperaba (sin comillas o comillas dobles). No se espera una 'Cadena', no estoy seguro de que pueda usar una declaración preparada aquí (al menos no con 'setString') –

+0

Sí, funciona aquí también ahora. ¡Muchas gracias! –

Cuestiones relacionadas