Java JPA-如何在查询多对多关系时防止不必要的连接

Java JPA-如何在查询多对多关系时防止不必要的连接,java,hibernate,jpa,pagination,spring-data,Java,Hibernate,Jpa,Pagination,Spring Data,我有实体产品和类别,它们通过简单的多对多关系连接在一起。我想得到一个按单个类别筛选的产品分页列表。我正在尝试编写一个Spring数据JPA自动方法或JPQL查询方法,该方法将生成类似于以下内容的SQL: select [...] FROM ProductToCategory ptc INNER JOIN Product p ON ptc.product_id=p.id WHERE ptc.category_id=? LIMIT ? OFFSET ? 由于ProductToCategory联接

我有实体产品和类别,它们通过简单的多对多关系连接在一起。我想得到一个按单个类别筛选的产品分页列表。我正在尝试编写一个
Spring数据JPA
自动方法或
JPQL
查询方法,该方法将生成类似于以下内容的
SQL

select [...] FROM ProductToCategory ptc INNER JOIN Product p ON ptc.product_id=p.id WHERE ptc.category_id=?  LIMIT ? OFFSET ?
由于
ProductToCategory
联接表不是
JPA实体
,我无法在
JPQL
中引用它,因此我能想到的最接近的东西是:

@Query("SELECT p FROM Category c INNER JOIN c.products p WHERE c=:category")
Page<Product> findByCategories(@Param("category") Category category, Pageable pageable);
@Query(“从类别c内部连接c.p中选择p,其中c=:类别”)
PageFindByCategories(@Param(“category”)类别,可分页;

但是产生的
SQL
生成与Category表的冗余联接,并在那里应用where子句,而不是
ProductToCategory
表中的Category
id
。有没有一种方法不必求助于原生的
SQL

我能看到的唯一方法是将一个实体映射到联接表,并将多对多ProductCategory替换为从Product和Category指向这个新实体的一对多关系

这样的更改实际上符合Hibernate的最佳实践:

不要使用外来关联映射: 实际测试用例 多对多的联想是罕见的。你需要的大部分时间 “链接表”中存储的其他信息。在这种情况下,它是 最好使用两个一对多的关联来创建一个中介 链接类。事实上,大多数协会都是一对多的 多对一因此,使用时应谨慎 任何其他关联样式