2017-08-10 2 views
0

私は今、頭を壁にぶつけている。通常、私はFROM句のサブクエリでこの問題を解決しますが、これはHQLでは許可されていません。 私は簡単な例を作りました。あなたが私を助けてくれることを願っています。最も高価なアイテムを選択するにはどうすればいいですか? Hibernate HQLの棚

CREATE TABLE PUBLIC.SHELF 
    (id INTEGER NOT NULL, 
     PRIMARY KEY (id) 
); 

CREATE TABLE PUBLIC.ITEM 
    (id INTEGER NOT NULL, 
    price INTEGER NOT NULL, 
    description VARCHAR(100) NOT NULL, 
     PRIMARY KEY (id) 
); 

CREATE TABLE PUBLIC.SHELF_ITEMS 
(shelf_id INTEGER NOT NULL, 
item_id INTEGER NOT NULL, 
    PRIMARY KEY (shelf_id, item_id) 
); 

そして、これから私は最も高価なアイテムのPRを選択します:

は私がDET以下の表を持って考えます。棚。 私は、次の文を照会することにより、それを達成することができます

SELECT 
    shelf.id, 
    MAX(item.price) 
FROM 
    PUBLIC.SHELF as shelf 
    INNER JOIN PUBLIC.SHELF_ITEMS as shelfitems ON shelf.id = shelfitems.shelf_id 
    INNER JOIN PUBLIC.ITEM as item ON item.id = shelfitems.item_id 
GROUP BY shelf.id; 

しかしONEより多くの要件があります! - アイテムIDと説明が同じ結果セットにも必要です。 は、だから私はこのような何かをしたい:

SELECT 
    shelf.id, 
    item.id, 
    item.description, 
    MAX(item.price) 
FROM 
    PUBLIC.SHELF as shelf 
    INNER JOIN PUBLIC.SHELF_ITEMS as shelfitems ON shelf.id = shelfitems.shelf_id 
    INNER JOIN PUBLIC.ITEM as item ON item.id = shelfitems.item_id 
GROUP BY shelf.id; 

しかし、私はすべての行を取得することを追加するとき、私はGROUP BY句でitem.idを追加する必要があり、というエラーで、このresultat。

私は、最も高価なものだけを選択してほしいと言っている状態がありません。

答えて

1
マッピングが正しく行われていると仮定し
SELECT 
    shelf.id, 
    item.id, 
    item.description, 
    item.price 
FROM 
    shelf shelf 
    INNER JOIN shelf_items shelfitems ON shelf.id = shelfitems.shelf_id 
    INNER JOIN item item ON item.id = shelfitems.item_id 
WHERE 
    item.price = (
     SELECT 
      MAX(item_inner.price) 
     FROM 
      shelf_items shelfitems_inner 
      INNER JOIN item item_inner ON item_inner.id = shelfitems_inner.item_id 
     WHERE 
      shelf.id = shelfitems_inner.shelf_id 
    ) 
+0

Works!どうもありがとう! – user1819127

+0

ようこそ:)既に気づいたことがあるように、棚に最高価格と同じ価格の複数の品目がある場合、各品目ごとに1つずつ、棚当たり複数の行が表示されます。 –

+0

それは本当です!通知ありがとう! – user1819127

1

エンティティを返す純粋HQL/JPQLソリューション、Itemと多対多Shelf

@SuppressWarnings("unchecked") 
public Map<Shelf, Item> getShelvesWithMaxItemPrice(){ 
    Query query = entityManager.createQuery("SELECT sh, it FROM Shelf sh join sh.items it WHERE it.price = " 
      + "(SELECT MAX(itInner.price) FROM Item itInner join itInner.shelves shInner WHERE shInner.id = sh.id)"); 
    List<Object[]> queryResults = query.getResultList(); 
    Map<Shelf, Item> results = new LinkedHashMap<>(); 
    for(Object[] row: queryResults) { 
     results.put((Shelf) row[0], (Item) row[1]); 
    } 
    return results; 
} 

これはと同じSQLを生成します。 Ashutosh Aの答えです。

+0

それを試したことはありませんが、投稿していただきありがとうございます!おそらく将来誰かを助けるだろう:) – user1819127

関連する問題