Сортировка проекции JPA по вопросам профсоюза с использованием критериев APIJAVA

Программисты JAVA общаются здесь
Anonymous
Сортировка проекции JPA по вопросам профсоюза с использованием критериев API

Сообщение Anonymous »

У меня есть следующий (упрощенный) код, который выполняет Unionall между двумя таблицами с использованием API -критериев, и извлекает проекцию, данную projectionDto . Эти Entites - просто примеры. < /P>
public List
someMethod(int offset, int size) {
HibernateCriteriaBuilder builder = entityManager.unwrap(Session.class).getCriteriaBuilder();

CriteriaQuery qUser = builder.createQuery(ProjectionDTO.class);
Root rootUser = qUser.from(UserEntity.class);
qUser.select(builder.construct(
ProjectionDTO.class,
rootUser.get("id").alias("field1"),
rootUser.get("role").alias("field2")
));

CriteriaQuery qItem = builder.createQuery(ProjectionDTO.class);
Root rootItem = qItem.from(ItemEntity.class);
qItem.select(builder.construct(
ProjectionDTO.class,
rootItem.get("quantity").alias("field1"),
rootItem.get("description").alias("field2")
));

CriteriaQuery qUnion = builder.unionAll(qUser, qItem);

List result = entityManager.createQuery(qUnion)
.setFirstResult(offset)
.setMaxResults(size)
.getResultList();
return result;
}
< /code>
Проекция определяется: < /p>
public class ProjectionDTO {

private Long field1;
private String field2;

public ProjectionDTO () {
}

public ProjectionDTO (Long field1, String field2) {
this.field1 = field1;
this.field2 = field2;
}
}
< /code>
Это работает нормально, но я безуспешно пытался реализовать пункт заказа, используя псевдонимы. Тем более, что после этого я хочу иметь возможность правильно обрабатывать страницу.qUnion.orderBy(builder.desc(builder.literal(1)));
< /code>
Но, очевидно, это всего лишь обходной путь, и упорядочение (возможно, по нескольким столбцам) известно только во время выполнения. В идеале я хотел бы сделать что -то вроде: < /p>
Root rootProjection = qUnion.from(ProjectionDTO.class);
qUnion.orderBy(builder.desc(rootProjection.get("field1")));
< /code>
где я могу заказать на основе псевдонима проекции. Но эта реализация, очевидно, неверна и не работает. обходной путь. Так что это меньше беспокойства (но, тем не менее, хороший бонус). < /P>
Я немного поиграл с подтех, так что, возможно, можно сделать так. Последнее средство будет строить запрос вручную.


Подробнее здесь: https://stackoverflow.com/questions/794 ... iteria-api

Вернуться в «JAVA»