Как создать собственный запрос для объединения связанных таблиц с помощью аннотации @Query - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь использовать аннотацию @Query с собственным запросом, чтобы получить информацию из базы данных, которую я намереваюсь использовать на одной из страниц моего приложения интернет-магазина. Я пытался найти похожий вопрос, но безуспешно, так что ... Вот часть рассматриваемой модели данных:

enter image description here

Класс продукции:

@Entity
@Table(name = "products")
public class Products {

public enum EProductType {
    FW_FISH, SW_FISH, P_FISH, CRAB_FISH, FW_PLANT, P_PLANT, TANK, FILTER, CO2, FOOD
    }

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "title")
private String title;
@Column(name = "description")
private String description;
@Column(name = "the_type")
@Enumerated(EnumType.STRING)
private EProductType productType;
@OneToMany(cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
    CascadeType.REFRESH }, mappedBy = "product")
private List<Stock> stock;
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
            CascadeType.REFRESH })
@JoinTable(name = "products_order", joinColumns = @JoinColumn(name = "id"), inverseJoinColumns = @JoinColumn(name = "product_id"))
private List<Orders> orders;

Класс акции:

@Entity
@Table(name = "stock")
public class Stock {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "price")
private double price;
@Column(name = "quantity")
private int quantity;
@Column(name = "price_date")
private Date priceDate;
@ManyToOne(cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
@JoinColumn(name = "product_id")
private Products product;

Класс заказа:

@Entity
@Table(name = "orders")
public class Orders {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "date_time")
private LocalDateTime date;
@Column(name = "total_price")
private double totalPrice;
@ManyToOne(cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
@JoinColumn(name = "user_id")
private Users user;
@ManyToMany
@JoinTable(name = "products_order", joinColumns = @JoinColumn(name = "id"), inverseJoinColumns = @JoinColumn(name = "order_id"))
private List<Products> products;

А вот и репозитории (согласно запросу в комментариях):

Хранилище акций:

public interface IStockRepository extends CrudRepository<Stock, Integer> {}

Хранилище продуктов:

public interface IProductsRepository extends CrudRepository<Products, Integer> {
@Query(value = "SELECT title, the_type, price, quantity FROM Products RIGHT OUTER JOIN Stock ON products.id=stock.product_id", nativeQuery = true)
    List<Products> getProductsInfoForTheHomePage();
}

Информация, которая мне нужна на html-странице: заголовок из таблицы продуктов и цена и количество из таблицы запасов. Я пытаюсь с этим запросом в моем интерфейсе репозитория:

@Query(value = "SELECT title, the_type, price, quantity FROM Products RIGHT OUTER JOIN Stock ON products.id=stock.product_id", nativeQuery = true)
List<Products> getProductsInfoForTheHomePage();

... но когда я пытаюсь вызвать метод в моем классе контроллера, получаю это исключение: java.sql.SQLException: столбец 'id' не найден. Вот что показывает регистратор Hibernate:

Hibernate: SELECT title, the_type, price, quantity FROM Products RIGHT OUTER JOIN Stock ON products.id=stock.product_id

Поскольку столбец присутствует в модели данных, я предполагаю, что проблема в запросе ... Извините за мой неуклюжий английский, надеюсь, кто-нибудь может мне помочь, потому что я застрял на этом какое-то время ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...