繁体   English   中英

使用MAX和JOIN的JPQL

[英]JPQL using MAX and JOIN

我正在尝试使JPQL查询工作,但似乎无法正确处理。

我有2个实体类,产品和包装。 一个产品可以有多个包装(可能没有),每个包装都有有效期。 我正在尝试编写一个查询,该查询返回产品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如下:

“从“ + Pack.class.getName()+”剩余的pk加入pp.id加入pk.product pr组”中,选择pk.product.id,pk.id,MAX(pk.expiryDate)作为maxExpiry。

我认为这可以正常工作,但是如果执行以下操作,则第二个限制的添加将因mysql中的“不正确使用group by”错误而失败:

从“ + Pack.class.getName()+ pk左”中选择pk.product.id,pk.id,MAX(pk.expiryDate)作为maxExpiry加入pk.product pr,其中:start和之间的MAX(pk.expiryDate) :按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

请注意,如果有多个包装的最大有效日期,那么此查询将返回一个以上的产品和一组包装。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM