【问题标题】:HQL query to select all unique entities grouped by the parameter value that is in relation to founded entitiesHQL 查询以选择按与已创建实体相关的参数值分组的所有唯一实体
【发布时间】: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 来实现它?

【问题讨论】:

    标签: java spring database hql


    【解决方案1】:

    是的,可以使用 HQL(休眠查询语言)过滤实体项。

    Hibernate 在其 HQL 查询中支持命名参数。这使得编写接受用户输入的 HQL 查询变得容易,并且您不必防御 SQL 注入攻击。以下是使用命名参数的简单语法 -

    String hql = "FROM Employee E WHERE E.id = :employee_id";
    Query query = session.createQuery(hql);
    query.setParameter("employee_id",10);
    List results = query.list();
    

    您可以探索更多关于 HQL here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多