Код: Выделить всё
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;
}
Код: Выделить всё
public class ProjectionDTO {
private Long field1;
private String field2;
public ProjectionDTO () {
}
public ProjectionDTO (Long field1, String field2) {
this.field1 = field1;
this.field2 = field2;
}
}
Я знаю, что могу заставить это работать, используя индекс, например:
Код: Выделить всё
qUnion.orderBy(builder.desc(builder.literal(1)));
Код: Выделить всё
Root
rootProjection = qUnion.from(ProjectionDTO.class);
qUnion.orderBy(builder.desc(rootProjection.get("field1")));
В идеале решение могло бы также обрабатывать предикаты при проекции, но на данный момент я могу добавить их в оба запроса по отдельности в качестве обходного пути. Так что это меньше беспокойства (но, тем не менее, это приятный бонус).
Я немного поигрался с подзапросами, так что, возможно, можно сделать и таким образом. В крайнем случае можно построить запрос вручную.
Подробнее здесь: https://stackoverflow.com/questions/794 ... iteria-api
Мобильная версия