【问题标题】:JPA - how to prevent an unnecessary join while querying many to many relationships [duplicate]JPA - 如何在查询多对多关系时防止不必要的连接[重复]
【发布时间】:2015-06-11 01:11:16
【问题描述】:

我有实体 Product 和 Category 以简单的多对多关系连接。我想获得按单个类别过滤的产品的分页列表。我正在尝试编写一个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 会产生与类别表的冗余连接,并在那里应用 where 子句,而不是在ProductToCategory 表中的类别id 上。有没有办法在不求助于原生 SQL 的情况下做到这一点?

【问题讨论】:

    标签: java hibernate jpa pagination spring-data


    【解决方案1】:

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

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

    https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/best-practices.html

    不要使用奇异的关联映射: 真实的实际测试用例 多对多关联很少见。大多数时候你需要 附加信息存储在“链接表”中。在这种情况下,它是 更好地使用两个一对多关联到中间 链接类。事实上,大多数关联都是一对多的,并且 多对一。 因此,您在使用时应谨慎行事 任何其他关联样式

    【讨论】:

      猜你喜欢
      • 2014-06-13
      • 2013-07-23
      • 2019-04-13
      • 1970-01-01
      • 2016-07-22
      • 2014-04-08
      • 1970-01-01
      • 2012-11-22
      • 2021-12-10
      相关资源
      最近更新 更多