2014-09-26 59 views
0

我有一個使用Hibernate創建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; 
..... 

正如你看到的,我把我的書,以便在列表中。我需要的查詢應該從數據庫中抽出所有不以任何順序顯示的圖書。 任何幫助表示讚賞。非常感謝。

+0

好吧,我建議一個簡單的事,加布爾列來預訂,如果至少有一個訂單列表中有它,那麼使該標誌爲真,所以以後你會發現所有有該標誌的書都是假的,但我不太確定,因爲當你從訂單中刪除一本書時在將該標誌設置爲false之前檢查第一個是否存在於其他順序列表中, – AntJavaDev 2014-09-26 15:01:32

+1

嗯,這是個好主意。我現在執行的方式正是這樣),儘管我的負責人表示,保留另一個布爾變量來檢查圖書的可用性不是最好的決定。更好的方法是把索引放在書的ID上,並通過namedquery執行該操作:) – DruidKuma 2014-09-26 16:30:12

回答

0

嘗試

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

找書對此有沒有順序,這本書是訂單的項目列表中的一員。

(我要指出,這可能不是非常有效,由於否定。萎靡不振的書籍,一旦它們出現在訂單實際上是更有效的。)

+0

謝謝你的建議,我會盡快嘗試一下我的筆記本電腦:) – DruidKuma 2014-09-26 16:32:04

+0

其實,它的工作原理。我遇到了另一個問題,但我會爲此創建另一個問題。謝謝! – DruidKuma 2014-09-27 08:24:55