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

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

Post 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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post