Мне нужно возвращать каждый заказ, имеющий более 2 товаров, связанных с заказом.Порядок и Продукт имеют много-много взаимосвязей, как указано ниже.
@Data
@Entity
@Table(name = "orders")
@JsonInclude(NON_NULL)
public class Order implements Serializable {
public static final int PRECISION = 2;
@Id
@GeneratedValue(strategy = IDENTITY)
@JsonIgnore
private String orderId;
. . . Other fields . . . .
@ManyToMany(fetch = EAGER, cascade = ALL)
@JoinTable(
name = "order_product",
joinColumns = @JoinColumn(name = "order_id", updatable = false, nullable = false),
inverseJoinColumns = @JoinColumn(name = "product_id", updatable = false, nullable = false)
)
private List<Product> products = new ArrayList<>();
}
и Продукт
@Data
@Entity
@Table(name = "products")
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@JsonIgnore
private String productId;
. . . . Other fields
}
Мой запрос SQL был бы
SELECT o.order_id, p.product_id from Orders o join
OrderProduct op on o.order_id = op.order_id join Product p on
op.product_id = p.product_id group by o.order_id, p.product_id having
(p.product_id) > 2
Мой лучшийпопытка написания этого запроса
@Query("SELECT o from Order o JOIN o.products where o.id = :id GROUP BY o HAVING (o.product) > 2")
List<Order> findOrderWithMultipleProducts();
возвращает следующую ошибку:
org.hibernate.QueryException: Not all named parameters have been set: [id] [SELECT o from Order o JOIN o.products where o.id = :id]
at org.hibernate.internal.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:391) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.internal.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:373) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:83) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:123) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:87) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
Контроллер просто вызывает эту функцию напрямую.Желаемая полезная нагрузка JSON выглядит примерно так:
{
"orderId": "order_id",
"products": [
{
"productId": "product_id_1",
},
{
"productId": "product_id_2",
},
{
"productId": "product_id_3",
}
]
}