У меня есть запас класса сущностей, в котором хранятся товар и склад двух сущностей. Сочетание товара и склада всегда будет уникальным, и для хранения информации о наличии товара для каждого товара на каждом складе используется складская сущность.
@Entity
public class Stock extends ReusableFields
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Long stockId;
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name="productId",nullable=false )
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@NotFound(action=NotFoundAction.IGNORE)
@NonNull
Product product;
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name="warehouseName",nullable=false)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@NotFound(action=NotFoundAction.IGNORE)
@NonNull
Warehouse warehouse;
@NonNull
Float quantityInHand;
//getter and setter
}
Теперь я хочу получить общий запас каждого товара, а затем подробный запас. , Например,
{
"data": [
{
"productId": 22,
"totalQuantityInHand": 50,
"details": [
{
"warehouse": "warehouse1",
"quantityInHand": 20
},
{
"warehouse": "warehouse2",
"quantityInHand": 30
}
]
}
]
}
Один из способов, которым я могу достичь этого, - это выбрать все записи со склада, затем выбрать уникальные идентификаторы продукта, затем выполнить цикл по каждому производителю и передать объекту DAO productid, totalquantity и список объектов запаса для этот продукт.
Я хочу знать, есть ли лучшее оптимальное решение, которое может спасти меня от написания итераций. По сути, если бы мне пришлось сделать то же самое в mysql, мой запрос был бы примерно таким:
SELECT
p.product_id AS productId,
s.warehouse_name AS warehouseId,
SUM(s.quantity_in_hand) AS quantity
FROM stock s
INNER JOIN product p
ON p.product_id = s.product_id
INNER JOIN warehouse w
ON w.warehouse_id = s.warehouse_name
GROUP BY productId,warehouseId
WITH ROLLUP;