ORDER BY с использованием API критериев

Когда я пишу HQL-запрос

Query q = session.createQuery("SELECT cat from Cat as cat ORDER BY cat.mother.kind.value");
return q.list();

Все в порядке. Однако, когда я пишу критерий

Criteria c = session.createCriteria(Cat.class);
c.addOrder(Order.asc("mother.kind.value"));
return c.list();

Я получаю исключение org.hibernate.QueryException: could not resolve property: kind.value of: my.sample.data.entities.Cat

Если я хочу использовать критерии и порядок, как я должен выражать свой "порядок"?

Ответ 1

Вам нужно создать псевдоним для mother.kind. Вы делаете это так.

Criteria c = session.createCriteria(Cat.class);
c.createAlias("mother.kind", "motherKind");
c.addOrder(Order.asc("motherKind.value"));
return c.list();

Ответ 2

Трудно знать наверняка, не видя сопоставления (см. комментарий @Juha), но я думаю, вы хотите что-то вроде следующего:

Criteria c = session.createCriteria(Cat.class);
Criteria c2 = c.createCriteria("mother");
Criteria c3 = c2.createCriteria("kind");
c3.addOrder(Order.asc("value"));
return c.list();

Ответ 3

Вы также можете добавить тип соединения:

Criteria c2 = c.createCriteria("mother", "mother", CriteriaSpecification.LEFT_JOIN);
Criteria c3 = c2.createCriteria("kind", "kind", CriteriaSpecification.LEFT_JOIN);

Ответ 4

Это то, что вам нужно сделать, поскольку sess.createCriteria устарела:

CriteriaBuilder builder = getSession().getCriteriaBuilder();
CriteriaQuery<User> q = builder.createQuery(User.class);
Root<User> usr = q.from(User.class);
ParameterExpression<String> p = builder.parameter(String.class);
q.select(usr).where(builder.like(usr.get("name"),p))
  .orderBy(builder.asc(usr.get("name")));
TypedQuery<User> query = getSession().createQuery(q);
query.setParameter(p, "%" + Main.filterName + "%");
List<User> list = query.getResultList();