С критериями API может использовать sqlProjection :
String func = format("count(distinct year(%s_.date))", criteria.getAlias());
String alias = "dateCol";
session.createCriteria(Foo.class).setProjection(
sqlProjection(
format("%s as %s", func, alias),
new String[] { alias },
new Type[] { Hibernate.LONG }
)
)
);
Это должно работать. Я не проверял это.
Единственная проблема с проекцией sql состоит в том, что вы должны знать (т.е. повторять) имя столбца.