2009-10-06 17 views
12

que tiene una asignación de hibernación como esto en una clase ProductDfnpredeterminado Hibernate para unirse anulable muchos-a-uno

@ManyToOne(fetch = FetchType.LAZY, optional = true) 
@JoinColumn(name = "productTypeFk", nullable = true) 
public ProductType getProductType() 
{ 
    return productType; 
} 

Tenga en cuenta que la relación se define como opcional (y la columna es anulable).

Al hacer HQL algo como esto

select p.name as col1, p.productType.name as col2 from ProductDfn p 

Una combinación interna se utiliza para unir a ProductDfn ProductType como Hibernate genera el SQL explícita unirse a partir de lo implícito se unen en la cláusula select.

Sin embargo, al hacer lo anterior cuando productType es nulo (en el DB) no se devuelve ninguna fila debido a la unión interna. Para esta relación, me gustaría tener hibernate predeterminado para hacer una combinación externa (porque la relación es opcional) por lo que obtendría un "nulo" para col2 en lugar de ninguna fila en absoluto.

¿Alguien sabe si esto es posible?

Gracias.

Respuesta

9

Se utiliza una unión interna porque ha enumerado explícitamente p.productType.name en su cláusula de selección. Esto no habría sucedido si hubiera seleccionado ProductDfn ya que su búsqueda está configurada en LAZY.

Si sólo necesita para recuperar esos dos propiedades que tendrá que especificar explícitamente una combinación externa en su consulta:

select p.name as col1, ptype.name as col2 
    from ProductDfn p 
    left join fetch p.productType ptype 
+1

Gracias, yo estaba buscando una manera de tener hibernación cambiar su defecto se unen tipo para uniones implícitas hechas en la cláusula de selección. La razón es que tenemos una aplicación donde muchas consultas se generan automáticamente/semi debido a la recuperación de datos tabulares. Así que podemos hacer object base = ProductDfn y col1 es name, col2 es productType.name etc. Normalmente esto funciona bien, solo para claves externas con nulos no funciona del modo que yo quisiera. –

+2

Sin embargo, no existe un "tipo de combinación predeterminado": la unión implícita siempre será interna. Si sus consultas se están generando, considere el uso de Criteria en lugar de HQL; básicamente obliga al uso a describir explícitamente la asociación (a través de alias/criterios anidados) y siempre puede especificarlo como unión externa. – ChssPly76

Cuestiones relacionadas