2016-04-01 39 views
0

我有如下數據: -JPA規範複雜的查詢

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 

和JPA規範我要執行下面的查詢類似如下: -

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; 

結果將是以下: -

Product Qty 
Pepsi 18 
Coke 90 

我使用JPA規範的第一次,我不不知道如何執行查詢來獲取當前庫存表。

+0

目前尚不清楚如何你可以達到18和90,簡化你的樣品數據集到每個可樂公司可能會使它更容易理解的3行。 –

回答

0

假設你有一個Entity,說Beverage,映射到上表Stock爲:

@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; 
} 

您可以按以下使用case statement along with sumJPQL

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

感謝您的回答,但我正在使用一些像這樣的鏈接。 http://www.baeldung.com/rest-api-search-language-spring-data-specifications 和我目前的方法,我無法找到它的createQuery只有三個參數作爲 公共謂語toPredicate(根根,CriteriaQuery 查詢,CriteriaBuilder構建器) –

+0

您可以給我想法如何使用CriteriaBuilder來做到這一點。 –