Создать запрос, который выбирает, проверяя элементы в связанном списке - PullRequest
0 голосов
/ 22 января 2020

У меня есть 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. Спасибо.

1 Ответ

0 голосов
/ 23 января 2020

Насколько я понимаю, 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> getShopsByOpenDates(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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...