2016-04-01 44 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来做到这一点。 –