#java #hibernate #spring-boot #hql #jointable
#java #переход в спящий режим #spring-загрузка #hql #Присоединиться
Вопрос:
У меня есть две сущности:
@Entity
public class Customer {
@Id
@GeneratedValue
private int id;
@Column(nullable = false)
private String name;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Collection<Coupon> coupons;
}
@Entity
public class Coupon {
@Id
@GeneratedValue
private int id;
@Column(nullable = false)
private String title;
@ManyToMany(mappedBy = "coupons")
private Collection<Customer> customers;
}
В базе данных есть три таблицы: customer
, coupon
и customer_coupons
, клиент может приобрести купон, и после покупки таблица customer_coupons
сохраняется customers_id
, и coupons_id
(у клиента может быть много купонов, а у купона может быть много клиентов).
Мне нужно каким-то образом получить купон клиента по customerId
и couponId
из customer_coupons
таблицы. У меня есть интерфейс CouponRepository
:
@Repository
public interface CouponRepository extends JpaRepository<Coupon, Integer> {
@Query("SELECT c FROM Coupon c WHERE c.id IN (SELECT coupons.id FROM customer_coupons WHERE coupons_id = ?1 AND customer_id = ?2)")
Coupon findCustomerCoupon(int couponId, int customerId);
}
Но этот запрос не работает, я получаю QuerySyntaxException: customer_coupons is not mapped
. Кто-нибудь может помочь мне создать правильный запрос?
Комментарии:
1. Я думаю, дело в том, что нужно использовать язык запросов jpa, а не настоящий sql. Нет объекта с именем «customer_coupons». Вы должны определить взаимосвязи с помощью таблицы «customer_coupons», но в запросах вы больше не используете эту таблицу, просто используйте Coupon.customers
2. @fairtrax да, я это понял, но все еще не могу найти правильный запрос в JPQL. Я попробую то, что вы рекомендуете.
3.
select coupon from Customer c join c.coupons coupon where c.id = :customerId and coupon.id = :couponId
. docs.jboss.org/hibernate/orm/current/userguide/html_single /…4. @JBNizet большое вам спасибо! Это ответ.
Ответ №1:
ВЫБЕРИТЕ купон У клиента c JOIN c.coupons купон, ГДЕ c.id = :CustomerID И coupon.id = :CouponID
Ответ от JB Nizet