使用GroupBy,OrderBy和Sum Function时,带有Outer Join的JPQL查询返回空列表

时间:2014-12-24 07:52:03

标签: jpa jpa-2.0 spring-data jpql spring-data-jpa

这是我的产品实体:

@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);

0 个答案:

没有答案