Обнаружилось, что detached-критерии использующиеся в подзапросах не работоспособны без проекций. Лично мне кажется, что критерия без проекции должна возвращать список объектов класса, над которым она построена (на уровне SQL-запроса – список идентификаторов).
DetachedCriteria postsCriteria = DetachedCriteria.forClass(Post.class).add(anyRestriction);
...
Subqueries.propertyIn("postId", postsCriteria)
...
Ошибка, которую выдаст hibernate выглядит так:
Caused by: java.lang.NullPointerException at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:341) at org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:153) at org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:69) at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:357) at org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:113) at org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:82) at org.hibernate.loader.criteria.CriteriaLoader.(CriteriaLoader.java:91) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1578) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306) at ru.any.dao.Dao.get(Dao.java:220) ...
Наличие NPE говорит, как раз, о недоработке этого момента. Если проекция обязательна, то такую ситуацию нужно обрабатывать и выдавать соответствующее сообщение. В Jira Hibernate нашлась оооочень древняя задача на эту тему HHH-993, почему-то её тип определён как «Улучшение»… Больше похоже на баг.
Решение – добавить проекцию по идентификатору:
DetachedCriteria postsCriteria = DetachedCriteria.forClass(Post.class) .add(anyRestriction) .setProjection(Projections.id());