【问题标题】:ManyToMany query in JPAJPA 中的多对多查询
【发布时间】:2018-05-14 07:38:45
【问题描述】:

我有两个表/实体。一切正常(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

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

【问题讨论】:

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


    【解决方案1】:

    如果您想要所有已分配书籍的类别,那么我认为您只需要查询 Category 实体即可检查其书籍收藏的大小:

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

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

    【讨论】:

    • 所以我在 Repository List&lt;Category&gt; findDistinctByBookIsGreaterThan(int i) 类别中尝试了这个,但它给了我一个 NoSuchElementException
    • 不是直接的 JPQL 查询吗?
    • @jared 我不知道我的答案的确切命名方法语法。但如果需要,您应该始终能够直接使用 JPQL。
    【解决方案2】:

    据我了解,您需要一个用于您的类别的 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);
    }
    

    然后检查它是否为空。

    【讨论】:

    • 但是我想要所有有书的类别,不管是什么书。
    • 此代码将找到所有包含书籍的类别并显示它们。如果没有书,它将找不到书。 "List categroyList= categoryRepository.findByBookId(bookId)" 然后您只需检查 categoryList 是否为空,那么它不应该在模型中显示。如果可以的话,张贴你的控制器,这样我就可以看到你在做什么。我的意思是,这就是你要找的,对吧?如果类别为空,它不应该显示?如果里面有书,应该显示
    • 看看我的编辑,我会退出,直到明天我可以再次思考。
    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 2020-03-29
    • 2018-10-31
    • 2016-06-03
    • 2015-05-05
    • 2013-11-18
    • 2011-03-08
    相关资源
    最近更新 更多