#java #spring #hibernate #jpa
#java #spring #переход в спящий режим #jpa
Вопрос:
Я пытаюсь использовать аннотацию @Query с собственным запросом для получения информации из базы данных, которую я намерен использовать на одной из страниц моего приложения для веб-магазина. Я пытался найти похожий вопрос, но безуспешно, так что вот… Вот часть модели данных, о которой идет речь:
Класс Products:
@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;
Класс Order:
@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-странице, — это: название из таблицы products и цена и количество из таблицы stock.
Я пытаюсь выполнить этот запрос в интерфейсе моего репозитория:
@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: SELECT title, the_type, price, quantity FROM Products RIGHT OUTER JOIN Stock ON products.id=stock.product_id
Поскольку столбец присутствует в модели данных, я предполагаю, что проблема заключается в запросе…
Извините за мой неуклюжий английский, надеюсь, кто-нибудь сможет мне помочь, потому что я застрял на этом на некоторое время…
Комментарии:
1. Не могли бы вы, пожалуйста, добавить код для трех репозиториев для запасов, заказа и продуктов. А также, пожалуйста, добавьте код для объекта Order.
2. Спасибо за ваше время, Татенда! Я добавил код, который вы просили. Вы заметите, что в нем отсутствует репозиторий Orders. У меня нет такого репозитория, поскольку я не думал, что он мне понадобится на данном этапе проекта. В модели данных ‘products’ и ‘orders’ имеют N-N отношений и связаны с использованием таблицы ‘products_order’.
3. Я не думаю, что смогу помочь дальше. Я протестировал ваш код и его работу на моей машине. Ваш собственный запрос также в порядке, как вы могли убедиться, запустив его непосредственно в вашей базе данных.