2016-04-01 14 views
0

I unten Daten: -JPA-Spezifikation komplexe Abfrage

Product Reason Qty 
Pepsi IN  10 
Pepsi Out 2 
Pepsi In  15 
Pepsi Out 5 
Coke IN  100 
Coke Out 20 
Coke In  35 
Coke Out 25 

und JPA-Spezifikation i wie unten unten Abfrage etwas ausführen will: -

select * from (
(select SUM(QTY) from stock where reason like 'IN') as INDATA - 
(select SUM(QTY) from stock where reason like 'OUT') as OUTDATA 

) as TBL; 

Ergebnis wird im Folgenden sein: -

Product Qty 
Pepsi 18 
Coke 90 

Ich verwende JPA-Spezifikation zum ersten Mal und ich weiß nicht, wie Sie die Abfrage ausführen, um aktuelle zu erhalten Lager aus der Lagerliste.

+0

Es ist nicht klar, wie Sie kommen auf 18 und 90 und vereinfachen Ihren Beispieldatensatz weiter auf vielleicht 3 Zeilen für jedes Cola-Unternehmen, um es verständlicher zu machen. –

Antwort

0

Unter der Annahme, dass Sie eine Entity haben, sagen Beverage, ist, dass auf die obige Tabelle abgebildet Stock wie:

@Entity 
@Table(name="Stock") 
class Beverage { 
    public Beverage(String brand, String reason, int quantity) { 
     this.brand = brand; 
     this.reason = reason; 
     this.quantity = quantity; 
    } 

    public Beverage() {} 

    @Id 
    @GeneratedValue 
    Integer id; 

    String brand; 
    String reason; 
    int quantity; 
} 

Sie case statement along with sum wie unten mit JPQL verwenden können:

Query query = entityManager.createQuery("select new map(b.brand as brand, sum(case b.reason when 'IN' then b.quantity else -b.quantity end) as quantity) from Beverage b group by b.brand"); 
List<Map> list = query.getResultList(); 
for(Map m : list) 
    System.out.println(m.get("brand") + "-" + m.get("quantity")); 
+0

Danke für die Antwort, aber ich benutze einige wie diesen Link. http://www.baeldung.com/rest-api-search-language-spring-data-specifications und in meiner aktuellen Methode bin ich nicht in der Lage, createQuery zu finden, es hat nur drei Argumente als öffentliche Prädikat toPredicate (Root root , CriteriaQuery Abfrage, Criteria Builder Builder) –

+0

Können Sie mir bitte eine Idee, wie es mit CriteriaBuilder zu tun. –