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.
Sortieren einer JPA -Projektion einer Union -Abfrage unter Verwendung von Kriterien -API ⇐ Java
-
- Similar Topics
- Replies
- Views
- Last post