这是我的产品实体:
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotBlank
private String name;
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
private Category category;
...
}
这是关系product-order:
的productOrder联结表@Entity
public class ProductOrder {
@EmbeddedId
private ProductOrderId pk;
@Min(value = 1)
private int quantity;
...
}
这是embeddedId类:
@Embeddable
public class ProductOrderId {
@ManyToOne
@JoinColumn(name = "product_id")
private Product product;
@ManyToOne
@JoinColumn(name = "orderr_id")
private Order order;
...
}
我有这个JPQL查询工作完美,它可以找到一个类别中的所有产品,根据它们的总销售数量对它们进行排序。由于它是一个外部联接,我也得到了尚未售出的那些:
@Query(value = "select p, sum(po.quantity) as total_quantity " +
"from ProductOrder po " +
"right join po.pk.product p where p.category = (?1) " +
"group by p.id, p.name " +
"order by total_quantity desc nulls last")
Page<Object[]> findBestSellerProductsByCategory(Category category, Pageable pageable);
问题是,当某个类别中没有任何已售产品时,我会得到一个空白页面。因此,为了使用此查询,我的类别必须至少有1个已售出的产品,然后我还得到尚未销售的其他产品。这有什么问题?
由于我从&#34;中选择了来自junctionTable(ProductOrder)&#34;,当此表中的类别中没有任何元素时,我得到一个空列表,据我所知。但是我不能反过来&#34;从产品&#34;中选择,因为产品没有productOrder表的引用,在这种情况下我无法建立连接关系..
INFO :当我删除groupBy时,它可以正常工作。我从一个类别中获取我的产品,即使它们都没有销售。
@Query(value = "select p " +
"from ProductOrder po " +
"right join po.pk.product p where p.category = (?1)")
Page<Object[]> findProductsByCategory(Category category, Pageable pageable);