如何在Hibernate HQL中选择最昂贵的项目公共货架?
此刻我的头撞在墙上。通常我会在FROM子句中使用子查询来解决这个问题,但是HQL中不允许这样做。 我举了一个简单的例子,希望你能帮助我 鉴于我有以下表格:如何在Hibernate HQL中选择最昂贵的项目公共货架?,hibernate,hql,Hibernate,Hql,此刻我的头撞在墙上。通常我会在FROM子句中使用子查询来解决这个问题,但是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 VARC
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)
);
我想从中选择最贵的商品。
我可以通过查询以下语句来实现这一点:
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;
但是,还有一个要求!-我还希望项目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;
但是,这会导致一个错误,指出我需要在GROUPBY子句中添加item.id,并且当我添加时,会得到所有行
这就像我遗漏了一些条件,说明我只希望选择最昂贵的项目。一个纯HQL/JPQL解决方案返回实体,假设映射正确,将其搁置在多对多项目中:
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
)
这将生成与Ashutosh A的答案相同的SQL。一个纯HQL/JPQL解决方案返回实体,假设映射正确完成,将其搁置在多对多的项目中:
这将生成与Ashutosh A答案相同的SQL。有效!非常感谢!欢迎光临:正如您可能已经注意到的,如果一个货架上有多个与最高价格相同的商品,您将在每个货架上获得多行,每个商品前一行。这是真的!谢谢你的通知!作品非常感谢!欢迎光临:正如您可能已经注意到的,如果一个货架上有多个与最高价格相同的商品,您将在每个货架上获得多行,每个商品前一行。这是真的!谢谢你的通知!还没有试过,但是谢谢你的发帖!将来可能会帮助某人:还没有尝试过,但是谢谢你的发帖!将来可能会帮助某人:
@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;
}