2011-06-29 14 views
5

Tengo tres tablas:unirse NHibernate primero proporciona una "tendencia prevista para unirse a"

- Person 
- User 
- PersonSecret 

en referencia PersonSecret a persona y del usuario:

<class name="PersonSecret" table="PersonSecret" lazy="false" > 
<id name="Id" column="Id" type="Guid">  
       <generator class="assigned"/> 
</id> 
... 
<many-to-one name="Person" class="Person" foreign-key="FK_Person_PersonSecret" lazy="proxy" fetch="select"> 
    <column name="PersonId"/> 
</many-to-one> 
<many-to-one name="User" class="User" foreign-key="FK_User_PersonSecret" lazy="proxy" fetch="select"> 
    <column name="UserId"/> 
</many-to-one> 

Este es el mapeo de usuario a PersonSecret:

<set name="PersonSecrets" lazy="true" inverse="true" cascade="save-update" > 
<key> 
    <column name="UserId"/> 
</key> 
<one-to-many class="PersonSecret"/> 

Y esto de una persona a PersonSecret:

<set name="PersonSecrets" lazy="true" inverse="true" cascade="save-update" > 
<key> 
    <column name="PersonId"/> 
</key> 
<one-to-many class="PersonSecret"/> 

Ahora, trato de seleccionar todas las personas, que tiene una entrada en PersonSecret para un usuario específico:

var query = this.Session.CreateQuery(@"from Person a inner join PersonSecret b 
      where b.UserId = :userId and b.RemindeBirthday = :remind"); 

Esto me da ahora el ExceptionMessage: "Ruta esperada para unirse"

¿Puede alguien ayudarme, lo que estoy haciendo mal? - Gracias.

Respuesta

3

Hay un par de problemas con su consulta HQL:

  • Al usar HQL que necesita para referencia los nombres de las propiedades de las clases del modelo en lugar de los nombres de las columnas que se asignan a . En este caso, debe hacer referencia a la propiedad PersonSecret.User.Id en su cláusula where, en lugar de la columna UserId.
  • También debe especificar la propiedad Person.PersonSecrets en la cláusula join, de lo contrario, NHibernate no sabrá a qué columnas se unirá.
  • Debe especificar su filtro adicional como condición de unión utilizando la palabra clave with en lugar de en la cláusula where.

Aquí está la versión correcta:

var query = this.Session.CreateQuery(
    @"from Person as a inner join a.PersonSecrets as b with b.User.Id = :userId and b.RemindeBirthday = :remind"); 

relacionados:

+0

@Enrico - Esto me da el mismo error :-( – BennoDual

+0

@ t.kehl Respondí un poco sobre esto. Actualicé mi respuesta con una solución diferente. –

+0

@Enrico - Can me explique cómo hacerlo: "especifique la propiedad Person.PersonSecrets en la cláusula join"? – BennoDual

-1

ha olvidado el término "ON".

inner join PersonSecret b ON b.PersonId = a.PersonId 
+1

HQL no admite la sintaxis SQL unirse. –

+0

luego use CreateSQLQuery en lugar de CreateQuery – Anubis