Имейте в виду, что hql-соединения не совпадают с обычными sql-соединениями.
С hql вы выполняете запросы к сущностям вместо таблиц.
Таким образом, соединения выполняются для полей, содержащихся вentity.
Если ваш класс продукта содержит список или набор PromotionCodeCategory, называемый "категориями", а ваша PromotionCodeCategory содержит список или набор ваучеров, называемых "ваучерами", то ваш запрос должен выглядеть следующим образом:
@Query("SELECT p.serviceName, p.category, v.code from Product p "
+ " INNER JOIN p.categories AS cp "
+ " INNER JOIN cp.vouchers as v "
+ " WHERE v.code = xxx")
Редактировать
Было отмечено, что существует только два объекта: продукт и ваучер.Следовательно, ваши классы должны выглядеть так:
@Entity
@Table(name = "products")
public class Product {
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name = "product_voucher", // insert join table name here
joinColumns = { @JoinColumn(name = "product_id") }, // insert product column name from join table here
inverseJoinColumns = { @JoinColumn(name = "voucher_id") } // // insert voucher column name from join table here
)
Set<Voucher> vouchers = new HashSet<>();
// standard constructor/getters/setters
}
@Entity
@Table(name = "vouchers")
public class Voucher {
@ManyToMany(mappedBy = "vouchers")
private Set<Product> products = new HashSet<>();
// standard constructors/getters/setters
}
Тогда запрос на соединение должен выглядеть так:
@Query("SELECT p.serviceName, p.category, v.code from Product p "
+ " INNER JOIN p.vouchers AS v "
+ " WHERE v.code = xxx")
Надеюсь, это поможет