我有实体产品和类别,它们之间具有简单的多对多关系。我想获得按单个类别过滤的产品的分页列表。我正在尝试编写将产生Spring Data 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 entity,而且我不能在JPQL中引用它,所以我能想到的最接近的是:@Query("SELECT p FROM Category c INNER JOIN c.products p WHERE c=:category")Page<Product> findByCategories(@Param("category") Category category, Pageable pageable);但是,生成的SQL与Category表产生冗余连接,并在此处应用where子句,而不是在id表中的类别ProductToCategory上。有没有办法不用本地SQL来做到这一点? 最佳答案 我看到的唯一方法是将一个实体映射到联接表,并用指向从Product和Category指向此新实体的一对多关系替换多对多Product Category。这样的更改实际上符合Hibernate的最佳实践:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/best-practices.html  不要使用外来关联映射:  实际的实际测试案例  多对多关联很少见。大多数时候您需要  附加信息存储在“链接表”中。在这种情况下  在中间使用两个一对多关联要好得多  链接类。实际上,大多数协会都是一对多的,  多对一。因此,使用时应谨慎进行  任何其他关联样式。
07-24 09:45
查看更多