创建通过查询相关列表中的项目进行选择的查询

问题描述 投票:0回答:1

我有Shop个实体:

@Entity
@Table(name = "shop")
public class Shop {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="shop_id")
private List<OpenDay> openDays = new ArrayList<>();
}

OpenDay实体:

@Entity
@Table(name = "open_day")
public class OpenDay {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private LocalDate date;
}

我需要一个查询,该查询将选择将Shop设置为特定日期的OpenDay的所有date,比如说今天和明天,所以我选择今天和明天都营业的商店。我该如何实现?最好使用Criteria API,这样我就可以在spring-data-jpa Specification中使用它。谢谢。

java jpa spring-data-jpa criteria criteria-api
1个回答
0
投票

据我了解,open_day表包含shop_id列。因此,我建议您将Shop字段添加到OpenDay实体。

@Entity
@Table(name = "open_day")
public class OpenDay {          
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   private LocalDate date;

   @ManyToOne
   @JoinColumn(name="shop_id")
   private Shop shop;
}

然后

EntityManager entityManager;

public List<Shop> getShopByOpenDates(List<LocalDate> dates) {
   CriteriaBuilder builder = entityManager.getCriteriaBuilder();
   CriteriaQuery<Shop> query = builder.createQuery(Shop.class);
   Root<OpenDay> openDay = query.from(OpenDay.class);

   Predicate predicate = openDay.get("date").in(dates);

   query.select(openDay.get("shop")).distinct(true).where(predicate);

   return entityManager.createQuery(query).getResultList();
}
© www.soinside.com 2019 - 2024. All rights reserved.