2009-12-03 25 views
1

我不知道JPA怎麼定義處理以下情形:如何處理JPA與可用外鍵條目聯接但不可用外鍵條目?

Table A: | Table B: 
ID FK_B | ID 
1 10 | 10 
2 null | 12 
3 11 | 

我想FK_B NULL或引用不可用表B項中的所有表A項。

public class A implements Serializable { 
    @Id 
    private Long id; 

    @JoinColumn(name = "FK_B", nullable = true) 
    @ManyToOne 
    private B b; 
} 

public class B implements Serializable { 

    @Id 
    private Long id; 
} 

是否定義,如果我用

SELECT a FROM A a LEFT JOIN a.b WHERE a.b IS NULL 

或會發生什麼:(?這是可能的)

SELECT a FROM A a LEFT JOIN B b on (b = a.b) WHERE b IS NULL 

我需要的是一個包含列表

A(id = 2) 
A(id = 3) 

非常感謝!

回答

1

表A中的第3行根據定義是非法的;如果沒有B且ID = 11,則表A中不能有該行,因爲您違反了外鍵約束。

只要從A獲得所有行,其中B爲空,您的第一個查詢應該可以工作。您也可以嘗試:

SELECT a FROM A a WHERE a.b.id IS NULL 

雖然我不是100%肯定這是否是有效的JPA QL語法(它的工作對Hibernate)

+0

非常感謝!它工作正常... – marabol 2009-12-22 15:47:02

+0

我必須學習,這statemant只適用於冬眠,但不與toplink ;-) 爲了您的聲明toplink生成此SQL語句: SELECT t0.ID,t0.FK_B FROM A t0 ,B T1 WHERE(t1.ID IS NULL)AND(t1.ID = t0.FK_B) 這正常工作與Hibernate和排名靠前的鏈接: 選擇一個從一個WHERE AB是NULL 比排名靠前的鏈接建立這個說法: SELECT t0.ID,t0.FK_B FROM A t0 WHERE(t0.FK_B IS NULL) – marabol 2010-01-13 17:14:28