【问题标题】:JPQL using MAX and JOINJPQL 使用 MAX 和 JOIN
【发布时间】:2014-09-16 05:49:26
【问题描述】:

我正在尝试使 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 中出现“不正确使用 group by”错误:

"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"

谁能帮我将这两个限制合并到一个查询中?谢谢。

【问题讨论】:

    标签: java jpa jpql


    【解决方案1】:

    怎么样:

    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
    

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

    【讨论】:

    • 嗨,抱歉花了一段时间才回答 - 它快到了,但我需要将 where 添加到内部选择以使其工作。谢谢!
    • 请您看看下面的问题好吗? stackoverflow.com/q/44437322/363573
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2020-09-13
    • 2013-11-13
    • 2019-03-21
    相关资源
    最近更新 更多