JPA中的ManyToMany查询

时间:2017-11-30 11:28:24

标签: java mysql jpa spring-boot spring-data-jpa

我有两个表/实体。所有工作都很好(省略了getter和setter)。

@Entity
    public class Book() {
    @Id;
    int id;
    @ManyToMany
    List<Category> categories;
}

@Entity
public class Category {
    @Id
    int id;
    @ManyToMany
    List<Book> books;
}

JPA / Hibernate使用名为book_category的连接表按预期创建数据库结构,该连接表包含字段book_id和category_id。

预先创建类别,因此并非所有类别都有书籍。 我想查询包含书籍的不同类别。

以下SQL查询执行此操作:

SELECT DISTINCT <things> FROM book_category JOIN category ON category.id = book_category.category_id

但是如何从存储库中获取类别列表?

2 个答案:

答案 0 :(得分:2)

如果您想要分配有书籍的所有类别,那么我认为您只需要查看Category实体的查询,该实体会检查其图书集的大小:

select c from Category where size(c.books) > 0

即使直接查询联结表也是可能的,例如通过原生查询,我认为这不会被视为良好的JPA实践。相反,您已经拥有的两个多对多实体应该允许您执行所需的查询。

答案 1 :(得分:0)

据我了解,您需要为您的类别提供JPA存储库。这将创建一个存储库,然后您可以使用它来获取包含书籍的类别。您只需要获得图书ID。 JPA非常灵活,所以这可能不是你想要的,而是自己尝试一下。

public interface CategoryRepository extends JpaRepository <Category, Integer>
{
    List<Category> findByBookId(Integer book);
}
编辑:好的,这是漫长的一天,我累了。如果你反过来试试怎么样?

public interface BookRepository extends JpaRepository <Book, Integer>
{
    List<Book> findAllByCategoryId(Integer category);
}

然后检查它是否为空。