我有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
中使用它。谢谢。
据我了解,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();
}