我正在尝试使用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如下:
“从”+中选择pk.product.id,pk.id,MAX(pk.expiryDate)为maxExpiry Pack.class.getName()+ “pk离开加入pk.product pr group by pp.id”
我认为这样可以正常工作,但是如果我这样做的话,在第二个限制中添加会因为mysql中“错误使用group by”错误而失败:
“从”+中选择pk.product.id,pk.id,MAX(pk.expiryDate)为maxExpiry Pack.class.getName()+ “pk left join pk.product pr其中MAX(pk.expiryDate)介于:start和:end group by pp.id”
任何人都可以帮助我将这些限制同时放入一个查询中吗?感谢。
答案 0 :(得分:2)
怎么样:
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
请注意,如果有多个包具有最大到期日期,则此查询将返回多一个产品和一组包。