Есть два @Entity - Meal и Restaurant, взаимосвязанные через @OneToMany - ресторан имеет List<Meal> mealList
. Вот сущности (геттеры и сеттеры намеренно не указал, но в коде они есть):
@Entity
@Table(name = "restaurants")
public class Restaurant {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@NotBlank(message = "Please fill the name")
private String name;
@NotBlank(message = "Please fill the address")
private String address;
private LocalDateTime registered;
private boolean isEnabled = true;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "restaurant")
private List<Meal> meals;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "restaurant")
private List<Vote> voteList;
public Restaurant() {
}
public Restaurant(String name, String address, List<Meal> meals) {
this.name = name;
this.address = address;
this.meals = meals;
}
}
@Entity
@Table(name = "meals")
public class Meal {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String description;
private Integer price;
private LocalDate date;
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "restaurant_id", nullable = false)
private Restaurant restaurant;
public Meal() {
}
public Meal(String description, Integer price, Restaurant restaurant) {
this.description = description;
this.price = price;
this.restaurant = restaurant;
}
}
В базе данных таблицы выглядят следующим образом:
CREATE TABLE restaurants
(
id INTEGER DEFAULT nextval('hibernate_sequence') PRIMARY KEY,
address VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
registered TIMESTAMP DEFAULT now() NOT NULL,
is_enabled BOOLEAN DEFAULT TRUE NOT NULL,
votes INTEGER DEFAULT 0 NOT NULL
);
CREATE UNIQUE INDEX restaurants_unique_name_address_idx ON restaurants (name, address);
CREATE TABLE meals
(
id INTEGER DEFAULT nextval('hibernate_sequence') PRIMARY KEY,
date DATE DEFAULT now() NOT NULL,
description VARCHAR(255) NOT NULL,
price INTEGER NOT NULL,
restaurant_id INTEGER NOT NULL,
FOREIGN KEY (restaurant_id) REFERENCES restaurants (id) ON DELETE CASCADE
);
CREATE UNIQUE INDEX meals_unique_restId_date_description_idx ON meals (restaurant_id, date, description);
Вопрос - как из @Repository, реализующий интерфейс Crud<Restaurant, Integer>
, вытащить рестораны, где у блюд указана конкретная дата (например, сегодняшняя)?
Возможно ли это реализовать через Data Jpa методы, именуемые findBy()?
Я бы использовал бы тут @Query
(JPQL).
В теории должно выглядить что-то в этом роде:
public interface RestaurantRepository extends CrudRepository<Restaurant, Integer> {
@Query("SELECT restaur from Restaurnats as restaur join fetch restaur.meals as meal where meal.date = ?1")
List<Restaurant> findAllByMealsByDate(LocalDate date)
}
@Query("select distinct r from Restaurant r join fetch r.meals m where m.date=?1")
List<Restaurant> findByRestaurantMealDate(LocalDate date);
Вот так работает! Всем спасибо!
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Делал сайт, всё вроде бы было норм, и тут приехали - часть шапки не поакзывается, а именно часть с меню и посиком (При чём только на версиях для...