2012-11-15 12 views
11

ich mich gefragt, ob es möglich ist, eine solche Abfrage zu erstellen, wie:Kriterien Builder neues Objekt in Select-Anweisung

em.createQuery(
     "SELECT NEW EmpMenu(p.name, p.department.name) " 
      + "FROM Project p ").getResultList(); 

es auch möglich ist, es über Spezifikation zu tun:

public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, 
     CriteriaBuilder cb) { 


    return ???; 
} 

Vielen Dank im Voraus !

+0

Ich weiß nicht, die Antwort, persönlich, aber hast du es versuchen? –

Antwort

19

Ja, die Kriterien-API hat ein Konstrukt, das den JPQL-Konstruktorausdrücken ähnelt. Die Klasse Resuls wird über die Methode construct in CriteriaBuilder festgelegt.

Ihre JPQL Abfrage als Kriterien Abfrage ausgedrückt ist:

CriteriaBuilder cb... 
CriteriaQuery<EmpMenu> q = cb.createQuery(EmpMenu.class); 
    Root<Project> c = q.from(Project.class); 
    q.select(cb.construct(EmpMenu.class, 
     c.get("name"), c.get("department").get("name"))); 
+3

GUT, Es ist genau das, was ich wollte! Aber jetzt habe ich eine andere Frage. Ich verwende Spring Data und Spezifikation, um Abfragen zu erstellen. Aus Ihrem Beispiel sehe ich, dass ich ** q.select ** aufrufen muss, aber in der Spezifikation wird select-Anweisung automatisch aufgerufen (bcs gibt nur das Prädikat zurück). Habe ich eine Chance, dies über die Spezifikationsschnittstelle zu tun? oder ich muss mein eigenes Repository erstellen, EntityManage aufrufen und die Abfrage erstellen .... – user1827052