2016-05-06 12 views
5

ho entitàorg.hibernate.QueryException: non ha potuto risolvere proprietà, ma un'altra proprietà è trovato

@Entity 
@Table(name = "CRM_LOG") 
public class CrmLog implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private @Getter @Setter Long id; 
    .......... 
    @OneToOne 
    private @Getter @Setter CrmUser crmUser; 
} 

e un'altra entità

@Entity 
@Table(name = "CRMUSER") 
public class CrmUser implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private Integer groupId; 

public Integer getGroupId() { 
     return groupId; 
    } 

    public void setGroupId(Integer groupId) { 
     this.groupId = groupId; 
    } 
} 

e faccio criteri di Hibernate selezionare

criteria.add(Restrictions.in("crmUser.id", selectedIds)); 

e funziona bene. ma questo criterio è fallito

criteria.add(Restrictions.in("crmUser.groupId", filterGroupIds)); 

ottengo un errore

org.hibernate.QueryException: could not resolve property: crmUser.groupId of: crm.entity.CrmLog 
+0

Si prega di inviare la piena interrogazione criteri di Hibernate, mi sembra come se si utilizza CrmLog come una radice e desidera limitare la groupId che è di proprietà di CrmUser. – rapasoft

risposta

4

questo codice

criteria.add(Restrictions.in("crmUser.id", selectedIds)); 

opere a causa della CrmLog tavolo ha CrmUserid come colonna chiave esterna. Quindi Hibernate non ha bisogno di aggiungere join nella query SQL.

Per aggiungere restrizioni su altre proprietà CrmUser è necessario aggiungere un alias. Tale alias dice a Hibernate di aggiungere join alla richiesta SQL.

criteria.createAlias("crmUser", "user"); 
criteria.add(Restrictions.in("user.groupId", filterGroupIds)); 

Per impostazione predefinita, Hibernate aggiunge un'unione interna. Per un LEFT JOIN

criteria.createAlias("crmUser", "user", JoinType.LEFT_OUTER_JOIN); 
criteria.add(Restrictions.in("user.groupId", filterGroupIds)); 

JoinType.LEFT_OUTER_JOIN può essere utilizzato con Hibernate 5 (forse Hibernate 4)

È possibile assegnare un alias per l'entità root. Forse tale esempio è più chiaro

Criteria criteria = session.createCriteria(CrmLog.class, "log"); 
criteria.createAlias("log.crmUser", "user"); 
criteria.add(Restrictions.in("user.groupId", filterGroupIds)); 
Problemi correlati