2016-04-01 12 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

Beverageを言う、あなたはEntityを持っていると仮定すると、それは上記のように、テーブルStockにマッピングされている:あなたはJPQLと以下のようにcase statement along with sumを使用することができます

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

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を見つけることができません。それは3つの引数しかありません。 public述語toPredicate(ルートルート、CriteriaQuery query、CriteriaBuilder builder) –

+0

CriteriaBuilderでどのように行うか考えてください。 –