Смотрите эту ссылку:
http://www.shredzone.de/cilla/page/53/how-to-fetch-a-random-entry-with-hibernate.html
Criterion restriction = yourRestrictions;
Object result = null; // will later contain a random entity
Criteria crit = session.createCriteria(Picture.class);
crit.add(restriction);
crit.setProjection(Projections.rowCount());
int count = ((Number) crit.uniqueResult()).intValue();
if (0 != count) {
int index = new Random().nextInt(count);
crit = session.createCriteria(Picture.class);
crit.add(restriction);
result = crit.setFirstResult(index).setMaxResults(1).uniqueResult();
}
Это то, что вы хотите. Сохраняйте Hibernate как слой абстракции, при этом сохраняя возможность запроса случайного объекта. Производительность немного страдает, хотя.
Несмотря на то, что я часто использую Hibernate, я не знаю более элегантного способа, которым легко пользоваться. Имхо, ты должен обернуть этот метод за фасадом.