使用MAX和JOIN的JPQL

时间:2014-07-24 15:16:29

标签: java jpa jpql

我正在尝试使用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”

任何人都可以帮助我将这些限制同时放入一个查询中吗?感谢。

1 个答案:

答案 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

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