2012-06-01 21 views
1

比方說,我有兩個JPA實體:發現不是從另一個實體引用的所有JPA實體

@Entity 
public class EntityA { 
    @Id 
    private String id; 

    @OneToMany 
    private List<EntityB> b; 

    ... 
} 

@Entity 
public class EntityB { 
    @Id 
    private String id; 

    ... 
} 

我想什麼來完成是定義一個@NamedQuery檢索不是從引用的所有EntityB實例任何EntityA

天真,我會試圖

@NamedQuery(name = "EntityB.findAllUnassigned", query = "SELECT b FROM EntityB b WHERE NOT b IN (SELECT DISTINCT a.b FROM EntityA a)") 

但這最終產生無效的SQL:

select b0_.id as id1_, b0_.attr, ... from b b0_ where b0_.id not in (select distinct . from a a1_, a_b ab2_, b b3_ where a1_.id=ab2_.a_id and ab2_.b_id=b3_.id) 

任何的替代品?

回答

4

奇怪的是,這個查詢不會給你一個例外。但是你的參考文獻在這方面不合法,你不能選擇集合本身,你想要/需要選擇集合元素。

SELECT b FROM EntityB b WHERE b NOT IN (SELECT DISTINCT elements(a.b) FROM EntityA a) 

但請注意,元素是Hibernate HQL構造,而不是JPA。

如果你關心JPA可移植性:

SELECT b FROM EntityB b WHERE b NOT IN (SELECT DISTINCT b2 FROM EntityA a join a.b b2) 

* NOT IN是比較正常的形式,所以我用的是,這裏還有

+0

你救了我的一天! –

0

你是什麼意思的無效SQL? 做你真正嘗試...WHERE b NOT IN...(注意的沒有改變位置)

+0

我加入了無效的SQL我的問題(子 - 選擇有一個空的投影)。交換「不」的位置沒有任何區別。 –

0

請試試這個,

SELECT DISTINCT b FROM EntityB AS b JOIN b.a AS a WHERE a IS NULL 

如果不能,嘗試

SELECT DISTINCT b FROM EntityB AS b JOIN b.a AS a WHERE a.id IS NULL 
+0

Hm ...'b.a'不存在(從'EntityB'到'EntityA'沒有反向關係,只是相反) –

0

的EntityB不知道它屬於哪個EntityA。可能會有一些模糊甚至是一些直觀的方式來做你想在JPQL中做什麼。但是從我的角度來看,如果你想提出這樣的問題,你就沒有建立你的對象模型的模型。

「嘿B,你是什麼 - 或者它是不是exitent」 將得到回答: 「什麼是」A「」。

在B中添加有關其與A中表觀關係的信息,將很快解決您當前的設計問題。

相關問題