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
表中的Categoryid
。有没有一种方法不必求助于原生的SQL
?我能看到的唯一方法是将一个实体映射到联接表,并将多对多ProductCategory替换为从Product和Category指向这个新实体的一对多关系
这样的更改实际上符合Hibernate的最佳实践:
不要使用外来关联映射:
实际测试用例
多对多的联想是罕见的。你需要的大部分时间
“链接表”中存储的其他信息。在这种情况下,它是
最好使用两个一对多的关联来创建一个中介
链接类。事实上,大多数协会都是一对多的
多对一因此,使用时应谨慎
任何其他关联样式