gpt4 book ai didi

java - 使用 MAX 和 JOIN 的 JPQL

转载 作者:行者123 更新时间:2023-12-02 05:36:13 27 4
gpt4 key购买 nike

我正在尝试让 JPQL 查询正常工作,但似乎无法正确执行。

我有 2 个实体类:Product 和 Pack。一个产品可以有多个包装(也可能没有),每个包装都有一个有效期。我正在尝试编写一个返回产品 ID、包 ID 和到期日期的查询,但仅适用于最近到期的包,并且仅当到期日期介于两个值之间时。

下面的简化代码:

@Entity
public class Product {
@Id
long id;

@OneToMany(fetch=FetchType.EAGER, mappedBy="product", cascade={CascadeType.ALL})
Set<Pack> packs;
}

public class Pack {
@Id
long id;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="product_id", nullable=false)
Product product;

@Temporal(TemporalType.DATE)
Date expiryDate;
}

我的JPQL如下:

"select pk.product.id, pk.id, MAX(pk.expiryDate) as maxExpiry from " + Pack.class.getName() + " pk left join pk.product pr group by pp.id"

我认为这工作正常,但是如果我这样做,添加第二个限制会失败,并出现 mysql 中的“不正确使用分组依据”错误:

"select pk.product.id, pk.id, MAX(pk.expiryDate) as maxExpiry from " + Pack.class.getName() + " pk left join pk.product pr where MAX(pk.expiryDate) between :start and :end group by pp.id"

任何人都可以帮助我将这两个限制合并到一个查询中吗?谢谢。

最佳答案

怎么样:

SELECT pk.product.id, pk.id, pk.expiryDate
FROM Pack pk
WHERE pk.expiryDate = (SELECT MAX(ppk.expiryDate) FROM Pack ppk where ppk.product = pk.product) AND
pk.expiryDate BETWEEN :start AND :end

请注意,如果有多个包装具有最长有效期,则此查询将返回多个产品和一组包装。

关于java - 使用 MAX 和 JOIN 的 JPQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24937678/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com