Jpa 使用GroupBy、OrderBy和Sum函数时,带有外部联接的JPQL查询返回空列表
这是我的产品实体:Jpa 使用GroupBy、OrderBy和Sum函数时,带有外部联接的JPQL查询返回空列表,jpa,jpa-2.0,spring-data,jpql,spring-data-jpa,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 Categ
@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;
...
}
这是关系产品订单的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);
@Query(value=“选择p,总和(采购订单数量)作为总数量”+
“来自ProductOrder po”+
“右键连接po.pk.product p,其中p.category=(?1)”+
按p.id、p.name分组+
“按总数量订购说明上次为空”)
PageFindBestSellerProductsByCategory(类别、可分页、可分页);
问题是,当一个类别中没有任何售出的产品时,我会得到一个空页面。因此,为了使用这个查询,我的类别必须至少有一个已售出的产品,然后我还要得到其他尚未售出的产品。这里有什么问题
因为我做了一个“selectfromjunctiontable(ProductOrder)”,当这个表中的类别中没有任何元素时,我会得到一个空列表。但是我不能用“从产品中选择”的另一种方式,因为产品没有productOrder表的引用,所以在这种情况下我不能建立连接关系
信息:当我删除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);
@Query(value=“select p”+
“来自ProductOrder po”+
“右键连接po.pk.product p,其中p.category=(?1)”)
PageFindProductsByCategory(类别、可分页、可分页);
您是否直接针对数据库尝试了Select语句?您确定可以使用GROUP BY子句中的SELECT中不包含的列吗?当我至少有1个已售出产品时,查询会起作用。所以我假设这不是问题所在,因为“select p”选择所有列,包括group by子句(p.name,p.id)中的列。