2014-09-26 3 views
0

최대 절전 모드로 NamedQuery를 생성하는 데 문제가 있습니다. 문제는 주문에 표시되지 않는 도서 목록을 선택해야한다는 것입니다.Hibernate 명명 된 쿼리 (다른 엔티티에 나타나지 않는 엔티티의 모든 인스턴스 선택)

@Entity 
@NamedQueries({ @NamedQuery(name = "Book.findAvailable", 
     query = "SELECT b FROM Book b WHERE b.id not in ????????") }) 
public class Book { 

    @Id 
    @GeneratedValue 
    private Long id; 

...... 

및 주문 : 보시다시피

@Entity(name = "orders") 
public class Order { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ElementCollection 
    private List<Book> items; 
..... 

, 나는 목록에 위해 내 책을 계속 내 클래스는 다음과 같이 보인다. 내가 필요로하는 질의는 어떤 순서로도 열등하지 않은 DB로부터 모든 책을 꺼내야한다. 도움을 주시면 감사하겠습니다. 많은 감사합니다.

+0

잘 내가 할 수있는 간단한 일을 제안하고, 부울을 추가 열을 예약하고 적어도 하나의 주문 목록에 그 내용이 포함되어 있으면 해당 플래그를 true로 만듭니다. 그러면 나중에 플래그가 false 인 모든 책을 찾을 수 있습니다. 주문한 도서를 삭제할 때 원인은 확실치 않습니다. 해당 플래그를 거짓으로 만들기 전에 다른 순서 목록에 존재하는 경우 1을 확인하십시오. – AntJavaDev

+1

글쎄, 좋은 생각입니다. 그리고 지금까지 구현 한 방법은 정확히 같습니다.) 내지도가 책의 가용성을 확인하기 위해 다른 부울 변수를 유지하는 것이 최선의 결정이 아니라고했지만. 더 좋은 방법은 책의 ID에 색인을 붙이고 namedquery를 통해 작업을 수행하는 것입니다. – DruidKuma

답변

0

이 책은 주문의 항목 목록의 구성원이되도록 어떤 순서가없는있는 책을 찾을

SELECT b 
FROM Book b 
WHERE NOT EXISTS (
    SELECT o 
    FROM Order o 
    WHERE b MEMBER OF o.items 
) 

을보십시오.

(나는이 때문에 부정에 아마 매우 효율적이지 있음을 알아 두셔야합니다. 플래그 표시 책을 그들이 순서로 발생하면되고 실제로 더 효율적입니다.)

+0

제안 해 주셔서 감사합니다. 랩톱에 연결하자마자 시도해 보겠습니다. – DruidKuma

+0

사실, 작동합니다. 나는 다른 문제를 만난다. 그러나 나는 그것에 대한 또 다른 질문을 만들 것이다. 고맙습니다! – DruidKuma