2010-12-17 20 views
7

En un sistema de EAV, tengo una asignación que se parece a esto:NHibernate HQL: combinación externa izquierda con "con" cláusula no funciona

<class name="Record"> 
    <map name="Values" table="RecordFieldValue"> 
     <key column="RecordFK"> 
     <index column="FieldFK"> 
     <element column="Value"> 
    </map> 
</class> 

me gustaría seleccionar algunos registros, ordenados por el valor de cada registro para un campo específico. Sin embargo, tenga en cuenta que no todos los registros en realidad tendrán un valor para ese campo. En este caso, el registro aún debe buscarse y clasificarse con un valor nulo.

El SQL deseada se vería así:

select rec.*, val.Value 
from Record rec 
left outer join RecordFieldValue val 
on val.RecordFK = rec.PK and val.FieldFK = :field 
order by val.Value 

Después de un montón de excavación, he encontrado que la forma correcta de modificar el estado "encendido" cláusula de la izquierda se unen en HQL es con el "con" palabra clave (ver https://nhibernate.jira.com/browse/NH-514). Así que probé este HQL:

from Record rec 
left join rec.Values vals with index(vals) = :field 
order by vals 

Desafortunadamente, esto produce el siguiente error: con cláusula de expresiones no hacen referencia a elementos de la cláusula a la que el con-cláusula se asoció. Así que he intentado esto en su lugar:

from Record rec 
left join rec.Values vals with index(rec.Values) = :field 
order by vals 

Pero que produjo un nuevo error: con la cláusula sólo puede hacer referencia a columnas en la tabla de conducción.

¿Alguna idea sobre cómo hacer este trabajo? Gracias.

- Brian

Respuesta

9

esto funciona:

bien documentados-
from Record rec 
left join rec.Values vals with vals.index = :field 
order by vals 

No exactamente intuitiva o, pero hace el trabajo.

+0

¿Se puede hacer lo mismo con Criterias? –

+0

Hermoso. Deseo que esta JPA left join query sea mejor conocida. Perdí un montón de tiempo. –

Cuestiones relacionadas