Как я могу получить объект из таблицы join с отношением ManyToMany? Spring Hibernate

#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