【发布时间】:2021-12-12 23:22:16
【问题描述】:
所以,我被下一个任务困住了。假设我有餐厅。它可以有很多订单,其中一些可能具有相同的成分类型,但到期时间不同。我需要编写 HQL,通过给定的 restaurantId 和 IngredientTypes 列表将获得最新鲜的结果(通过 IngredientInfo 实体中的 expiresAt 字段)。
假设我们有餐厅 = 1; IngedientTypes 列表:POTATO、SALMON。餐厅有 2 个订单:
1: { {POTATO: {expiresAt: 4}, {ORANGE:{expiresAt: 11} }
2: { {POTATO: {expiresAt: 9}, {SALMON: {expiresAt: 6} }
。 返回结果:
[{POTATO: {expiresAt: 4}, {SALMON: {expiresAt: 6}]
我有 4 个实体:
@Entity
@Table(name = "restaurants")
public class RestaurantEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
}
@Entity
@Table(name = "orders")
public class OrderEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "restaurantId")
RestaurantEntity restaurant;
@OneToMany(mappedBy = "order", fetch = FetchType.EAGER)
@BatchSize(size = 10)
List<IngredientEntity> ingredients;
}
@Entity
@Table(name = "ingredients")
public class IngredientEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
private IngredientType ingredientType;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "orderId")
private OrderEntity order;
@OneToMany(mappedBy = "ingredient", cascade = CascadeType.ALL)
@BatchSize(size = 10)
private List<IngredientInfoEntity> ingredientInfos
}
@Entity
@Table(name = "ingredient_info")
public class IngredientInfoEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@ToString.Exclude
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ingredientId")
IngredientEntity ingredient;
Instant expriresAt;
}
我确实写了一些查询:
@Query(value = " SELECT ie " +
" FROM OrderEntity oe INNER JOIN IngredientEntity ie " +
" ON oe.id = ie.order " +
" WHERE oe.restaurant.id = :restId AND ie.ingredientType in (:ingredientTypes) ")
List<IngredientEntity> findIngredients(String restId, List<IngredientType> ingredientTypes);
它确实返回了我:[{POTATO: {expiresAt: 9}, {POTATO: {expiresAt: 4}, {SALMON: {expiresAt: 6}]
所以,基本上我可以通过编程方式过滤该列表,但我的问题是是否可以编写 HQL 来实现它?
【问题讨论】: