Я использую JPA для своего проекта, и я хотел бы знать, что есть какой-либо способ подсчитать его подкласс для отношений друг к другу. Например, допустим, что есть класс заказа, который имеет несколько элементов, и мне нужно отобразить список заказов.JPA, подсчитывая свой подкласс для отношений один к одному
@Entity
@Table
public class Order {
...
@Id
private Long orderId;
@OneToMany
private List<OrderItem> orderItems;
}
Для получения списка мне нужно отобразить, сколько заказанных предметов и сколько предметов отменено. Таким образом, я добавил функции такие, что
@OneToMany
private List<OrderItem> orderItems;
...
public Long countOrderedItems() {
Long count = 0;
orderItems.forEach(orderItem -> {
if(orderItem.getStatus().equals(Status.ORDERED)){
count++;
}
});
return count;
}
public Long countCancelItems() {
Long count = 0;
orderItems.forEach(orderItem -> {
if(orderItem.getStatus().equals(Status.CANCEL)){
count++;
}
});
return count;
}
Однако, это выглядит неэффективно, и я хочу, чтобы получить эти два значения непосредственно, когда я получаю данные из хранилища, как:
@Query("SELECT o, (SELECT COUNT(oi) FROM OrderItem oi WHERE oi.Order.orderId = o.orderId AND oi.status = 'ORDERED') FROM Order o");
Но, я знаю, что это не правильный JPQL, и я хотел бы знать, как эффективно использовать эти значения в JPA.
Я думаю, что это не vio JPQL, так что он выглядит нормально. Однако я не знаю, как сопоставить 'count (io)' с полем. Если я добавлю переменную-член 'numberOfOrderedItems' в класс Order, то как ее можно сопоставить? Потому что я попробовал это, и он показал «Неизвестный столбец» order0_.number_of_ordered_items 'в' списке полей '' –
Он не может быть отображен в сущность. Список возвращаемых неидентифицированных запросов будет содержать Object [] {Order, int, int} –
Наконец, я добавил два поля для подсчета упорядоченного и отмененного состояния с @Transient и отобразил поля в функции построения. Итак, моя окончательная версия JPQL - это «SELECT new Order (o.orderId, ..., count (io), count (io2)) FROM Order o ...' Спасибо за вашу помощь @peter –