2016-05-06 7 views
5

Ich habe Entitätorg.hibernate.QueryException: konnte nicht Eigentum lösen, aber eine andere Eigenschaft gefunden wird

@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; 
} 

und ein anderes Unternehmen

@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; 
    } 
} 

gefühls Hibernate Kriterien wählen

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

und es funktioniert gut. aber diese Kriterien nicht bestanden

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

Ich erhalte einen Fehler

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

Bitte senden Sie das vollständige Hibernate Kriterien Abfrage, wie es mir scheint, als ob Sie CrmLog als Wurzel verwenden und wollen die groupId beschränken, die CrmUser Eigentum ist. – rapasoft

Antwort

4

Diesen Code

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

Werke wegen CrmLog Tabelle hat CrmUserid als Fremdschlüsselspalte. Hibernate muss also keine Joins in der SQL-Abfrage hinzufügen.

Um Einschränkungen für andere CrmUser Eigenschaften hinzuzufügen, müssen Sie einen Alias ​​hinzufügen. Ein solcher Alias ​​weist Hibernate an, der SQL-Anfrage einen Join hinzuzufügen.

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

standardmäßig Hibernate fügt eine innere Verknüpfung. Für eine LEFT JOIN

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

JoinType.LEFT_OUTER_JOIN mit Hibernate 5 verwendet werden (vielleicht 4 Hibernate)

Sie können einen Alias ​​an der Root-Entität zuweisen. Vielleicht solches Beispiel ist klar

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