首页 > 解决方案 > 特定 SQL 到 JPQL 查询转换

问题描述

我在 JPQL 中寻找这个 SQL 查询的等价物

SELECT l.*
FROM product_update l
    INNER JOIN (
        SELECT
            ID_PRODUCT,
            MAX(ID) AS maxID
        FROM product_update
        GROUP BY ID_PRODUCT
    ) groupel ON l.ID_PRODUCT = groupel.ID_PRODUCT
        AND l.ID = groupel.maxID
ORDER BY ID DESC 

我的java类

public class ProductUpdate extends BaseEntity {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PRODUCT_UPDATE_SEQUENCE")
@Column(name = "ID")
private Long id;

@JoinColumn(name = "ID_PRODUCT")
@ManyToOne()
private Product product;


@JoinColumn(name = "ID_VERSION")
@ManyToOne()
private Versioning versioning;
}

实际上,一个产品可能有多个版本,但系统只显示具有 max (id) 的产品示例:

1-Product 1 --- Version 1 
2-Product 2 --- Version 1
3-Product 3 --- Version 1
4-Product 1 --- Version 2
5-Product 3 --- Version 2
6-Product 3 --- Version 3

查询刚出来

2-Product 2 --- Version 1
4-Product 1 --- Version 2
6-Product 3 --- Version 3

感谢。

标签: jpajpql

解决方案


我终于得到了很好的查询,

select pu from ProductUpdate pu where pu.id in (select MAX(pUd.id) from ProductUpdate pUd group by pUd.product.id) ORDER BY pu.id DESC. 

我只是使用这篇文章JPA CriteriaBuilder 来加入子查询来执行我的答案。

  1. 使用 JPA 子查询仅在 WHERE 中定位,因此 Netbeans 警告
  2. JPA 中的 INNER JOIN 不接受子查询。

推荐阅读