Page 1 of 1

Sortieren einer JPA -Projektion einer Union -Abfrage unter Verwendung von Kriterien -API

Posted: 12 Feb 2025, 23:05
by Anonymous
Ich habe den folgenden (über vereinbaren) Code, der einen gewerkschaftlichen zwischen zwei Tabellen unter Verwendung von Kriterien -API durchführt und eine Projektion abruft, die durch projectiondto gegeben wird. Diese Ansprüche sind nur Beispiele. < /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>
Die Projektion ist angegeben durch: < /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>
Dies funktioniert einwandfrei, aber ich habe nicht versucht, die Auftragsklausel mit den Aliase zu implementieren. Vor allem, weil ich in der Lage sein möchte, die Paginierung ordnungsgemäß danach umzugehen.qUnion.orderBy(builder.desc(builder.literal(1)));
< /code>
Aber offensichtlich ist dies nur eine Problemumgehung und die Bestellung (möglicherweise durch mehrere Spalten) bekannt. Idealerweise möchte ich so etwas wie: < /p>
machenRoot rootProjection = qUnion.from(ProjectionDTO.class);
qUnion.orderBy(builder.desc(rootProjection.get("field1")));
< /code>
, wo ich basierend auf dem Projektion Alias ​​bestellen kann. Diese Implementierung ist jedoch offensichtlich falsch und funktioniert nicht. eine Problemumgehung. Es ist also weniger besorgniserregend (aber trotzdem ein schöner Bonus). Letzter Ausweg würde die Abfrage manuell erstellen.