# Hibernate: Criteria & SubQuery  - Unknown Entity null



## byte (8. Jul 2009)

Hi,

ich versuche folgendes HQL Statement in Criteria zu überführen, damit ich weitere Restrictions einfach per Example hinzufügen kann:

[HQL]select distinct m1
from MitarbeiterImpl m1
left join fetch m1.ergoEinschraenkungen e1
where m1.id in (
	select m2.id
	from MitarbeiterImpl m2
	left join m2.ergoEinschraenkungen e2
	where e2.code in ( :codes )
)[/HQL]

Mein Criteria sieht so aus:


```
Criteria c = getCurrentSession().createCriteria(MitarbeiterImpl.class, "m1");
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
c.createAlias("m1.ergoEinschraenkungen", "e1", Criteria.LEFT_JOIN);
DetachedCriteria subQuery = DetachedCriteria.forClass(MitarbeiterImpl.class, "m2")
                .add(Restrictions.in("m2.ergoEinschraenkungen.code", codes))
                .setProjection(Projections.property("m2.id"));
c.add(Subqueries.in("m1.id", subQuery));
```

Ich kriege aber immer eine Exception, die sehr nichtssagend ist:


```
Caused by: org.hibernate.MappingException: Unknown entity: null
	at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:550)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPropertyMapping(CriteriaQueryTranslator.java:518)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getType(CriteriaQueryTranslator.java:477)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getTypeUsingProjection(CriteriaQueryTranslator.java:459)
	at org.hibernate.criterion.InExpression.getTypedValues(InExpression.java:49)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getQueryParameters(CriteriaQueryTranslator.java:251)
	at org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:112)
	at org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:48)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:334)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:90)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:59)
	at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at de....dao.hibernate.GenericDaoHibernate.listResult(GenericDaoHibernate.java:109)
	at de.....dao.hibernate.MitarbeiterDaoHibernate.findByPage(MitarbeiterDaoHibernate.java:108)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138)
	... 94 more
```

Die Klasse MitarbeiterImpl ist selbstverständlich als Hibernate Entity gemappt.

Wie muss das Criteria aussehen, damit es funktioniert?

Grüße byto


----------



## byte (8. Jul 2009)

Ich habs jetzt einfach mit HQL gemacht und baue die Restrictions dynamisch zusammen statt Criteria Examples zu nutzen.

Ich bleibe bei meiner Meinung, dass die Criteria API nur bedingt einsetzbar ist. :autsch:


----------

