2009-12-03 38 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