我有两个表/实体。所有工作都很好(省略了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
但是如何从存储库中获取类别列表?
答案 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);
}
然后检查它是否为空。