Поиск в базе через Spring Data Jpa

187
01 февраля 2022, 21:50

Есть два @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()?

Answer 1

Я бы использовал бы тут @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)
}
Answer 2
@Query("select distinct r from Restaurant r join fetch r.meals m where m.date=?1")
List<Restaurant> findByRestaurantMealDate(LocalDate date);

Вот так работает! Всем спасибо!

READ ALSO
Как реализовать текст двух цветов

Как реализовать текст двух цветов

Появился в макете такой дизайн кнопки 404:

91
Выравнивание блока div по центру

Выравнивание блока div по центру

Как я могу выровнять по центру картинку внутри блока <div>?

108
тупят стили css

тупят стили css

Делал сайт, всё вроде бы было норм, и тут приехали - часть шапки не поакзывается, а именно часть с меню и посиком (При чём только на версиях для...

161