2009-12-03 10 views
1

Je me demande comment JPA définit pour gérer le scénario suivant:Comment gère JPA JOINs avec une entrée de clé étrangère disponible mais pas d'entrée étrangère disponible?

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

Je veux que tous le tableau A avec entrées FK_B NULL ou référence non disponible Entrée Tableau B.

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; 
} 

Est-il défini, qu'arrive-t-il si j'utilise

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

ou: (? Est-ce possible)

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

Ce que je besoin est une liste contenant

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

Merci beaucoup!

Répondre

1

La ligne 3 de votre tableau A est illégale par définition; s'il n'y a pas B avec ID = 11, vous ne pouvez pas avoir cette ligne dans la table A car vous violez la contrainte de clé étrangère.

En ce qui concerne l'obtention de toutes les lignes de AB est null, votre première requête devrait fonctionner. Vous pouvez aussi essayer:

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

bien que je ne suis pas 100% sûr que c'est valide syntaxe JPA QL (il fonctionne pour Hibernate)

+0

Merci beaucoup! Cela fonctionne bien ... – marabol

+0

Je dois apprendre que ce statemant ne fonctionne qu'avec hibernate, mais pas avec toplink ;-) Pour votre instruction toplink, générez cette instruction SQL: SELECT t0.ID, t0.FK_B FROM A t0 , B t1 WHERE (t1.ID IS NULL) eT (t1.ID = t0.FK_B) cela fonctionne bien à la fois mise en veille prolongée et TopLink: SELECT FROM a WHERE IS NULL ab Than TopLink construire cette déclaration : CHOISIR t0.ID, t0.FK_B FROM A t0 O ((t0.FK_B EST NULL) – marabol