2017-11-30 9 views
2

두 개의 테이블/엔티티가 있습니다. 모두 정상적으로 작동합니다 (게터와 세터 생략). 필드가 book_id 및 CATEGORY_ID 포함 조인 테이블이라고 book_category 예상대로JPA에서 ManyToMany 쿼리

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

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

JPA/Hibernate는 데이터베이스 구조를 만듭니다.

카테고리가 사전에 만들어져 있으므로 모두가 책을 가지고있는 것은 아닙니다. 책이있는 고유 한 카테고리를 쿼리하고 싶습니다.

다음 SQL 쿼리는 작업을 수행합니다

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

그러나 어떻게 저장소에서 범주의 목록을 얻을 수 있나요? 당신이 그들에게 할당 된 모든 도서의 범주를 원하는 경우

답변

2

, 그때 당신은 그냥 그 책 모음의 크기를 확인하는 Category 개체에 대한 쿼리를 필요가 있다고 생각 :

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

심지어 접합 테이블을 조회하는 경우 직접적으로 가능할 것이다. 네이티브 쿼리를 통해, 이것이 JPA의 훌륭한 실천이라고 생각하지는 않습니다. 오히려, 이미 가지고있는 두 개의 다 대다 엔티티는 필요한 조회를 수행 할 수 있어야합니다.

+0

그래서 내가 findDistinctByBookIsGreaterThan이 (내가 INT) 카테고리 저장소 '목록이 시도'그러나 그것은'NoSuchElementException' – jared

+0

가 직접 JPQL 쿼리하지 옵션입니다 나에게 준다? –

+0

@jared 필자의 대답에 대한 정확한 명명 된 구문 구문을 모르겠습니다. 그러나 필요한 경우 항상 JPQL을 직접 사용할 수 있어야합니다. –

0

제가 알기에, 당신은 당신의 카테고리를위한 JPA 저장소를 원합니다. 이렇게하면 저장소가 생성되고이를 사용하여 책이있는 범주를 가져올 수 있습니다. 도서 ID를 받아야합니다. JPA는 매우 유연하므로 정확히 원하는 것은 아니지만 스스로 시도하십시오.

public interface CategoryRepository extends JpaRepository <Category, Integer> 
{ 
    List<Category> findByBookId(Integer book); 
} 

EDIT : 좋아, 오래되었습니다. 반대로하면 어때?

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

그런 다음 null인지 확인하십시오.

+0

하지만 책이 무엇인지에 관계없이 책이있는 모든 카테고리를 원합니다. – jared

+0

이 코드는 책이 들어있는 모든 카테고리를 보여줍니다. 책이 없다면 책을 찾지 못할 것입니다. "목록 categroyList = categoryRepository.findByBookId (bookID로서)" 그런 다음 당신은 그냥 categoryList는 다음 모델에서 보여 안 비어 있는지 확인합니다. 가능하다면 컨트롤러를 게시하면 내가하는 일을 정확하게 볼 수 있습니다. 내 말은, 그게 니가 찾는거야, 맞지? 카테고리가 비어 있으면 표시되지 않아야합니까? 거기에 책이 있다면, – Sibuscus

+0

내 편집을 참조하십시오, 나는 곧 다시 생각할 수있는 내일까지 그만 둘 것입니다. – Sibuscus