【问题标题】:Many to many Jpa Query Spring boot多对多 Jpa 查询 Spring boot
【发布时间】:2020-03-29 15:05:27
【问题描述】:

我有三个具有多对多关系的 mysql 表,我正在尝试在 Spring Boot 上进行 Jpa 查询。这些表是

  • 具有字段 id、名称的产品
  • 额外的字段 ID、名称
  • product_extra 字段为 id、product_id、extra_id

产品表与额外表有多对多的关系,因为一个产品可以有很多额外的,因此需要product_extra表

这是我想在我的项目中包含的查询

SELECT extra.name 
FROM extra 
INNER JOIN product_extra ON extra_id = extra.id
WHERE product_id = ?;

我应该有一个@ManyToMany 注释,我应该在哪里拥有它

【问题讨论】:

  • 你能解释一下你的用例吗?

标签: mysql hibernate spring-boot jpa


【解决方案1】:

是的,你应该这样做。使用@ManyToMany 在Product 和Extra 之间进行映射。确保使用Set 而不是List 进行映射,以便拥有better performance。它看起来像:

@Entity
@Table(name="product")
public class Product{

    @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
    @JoinTable(name = "product_extra",
        joinColumns = @JoinColumn(name = "product_id"),
        inverseJoinColumns = @JoinColumn(name = "extra_id")
    )
    private Set<Extra> extras = new HashSet<>();

}

@Entity
@Table(name="extra")
public class Extra{

    @ManyToMany(mappedBy = "extras")
    private Set<Product> products = new HashSet<>();
}

映射它们之后,您可以使用 JPQL 通过 id 及其额外的 by 获取产品:

select p from Product p left join fetch p.extras where p.id = :productId;

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 2021-04-13
    • 2016-01-31
    • 2018-10-31
    • 2016-06-03
    • 2017-10-28
    • 2020-05-12
    • 2020-10-02
    相关资源
    最近更新 更多