2010-05-10 12 views
6

Me gustaría asociar 2 entidades utilizando anotaciones de hibernación con una cláusula de unión personalizada. La cláusula está en la igualdad habitual de FK/PK, pero también donde el FK es nulo. En SQL esto sería algo así como:Cláusula de unión personalizada de hibernación en asociación

join b on a.id = b.a_id or b.a_id is null 

De lo que he leído que debo usar la anotación @WhereJoinTable de la entidad titular, pero estoy confundido acerca de cómo especificar esta condición ... sobre todo la primera parte de eso - refiriéndose a la identidad de la entidad que se une.

¿Alguien tiene un ejemplo?

+0

Si b.a_id es nulo, entonces ¿pertenece a cada objeto que es un a? –

+0

sí todos los objetos de 'a' tendrían 'b' donde b.a_id es nulo – mysomic

Respuesta

18

Aquí hay un ejemplo usando el paradigma estándar padre/hijo que creo que debería funcionar usando la anotación básica @Where.

public class A { 
    ... 
    @ManyToOne(fetch = FetchType.EAGER) // EAGER forces outer join 
    @JoinColumn(name = "a_id") 
    @Where(clause = "a_id = id or a_id is null") // "id" is A's PK... modify as needed 
    public B getB() { return b; } 

} 

public class B { 
    ... 
    @OneToMany(mappedBy = "b") 
    public List<A> getA() { return a; } 
} 
+0

¿Existe una solución similar para EclipseLink? – Huntro

+0

No, pero puede usar DescriptorCustomizer http://wiki.eclipse.org/EclipseLink/Examples/JPA/MappingSelectionCriteria –

Cuestiones relacionadas