2016-05-06 33 views
5

Mam podmiotorg.hibernate.QueryException: nie można rozwiązać właściwość ale inna nieruchomość znajduje

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

i inny podmiot

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

i robię hibernacji kryteria wyboru

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

i działa dobrze. ale to kryteria nie powiodła

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

pojawia się błąd

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

proszę pisać pełną kryteria hibernacji zapytanie, to wygląda mi się, jeśli używasz CrmLog jako root i chcą ograniczyć GroupID który jest własnością CrmUser użytkownika. – rapasoft

Odpowiedz

4

ten kod

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

prace z powodu CrmLog tabela ma CrmUserid jako kolumny klucza obcego. Więc Hibernate nie musi dodawać sprzężeń w zapytaniu SQL.

Aby dodać ograniczenie do innych właściwości CrmUser, należy dodać alias. Taki alias mówi Hibernate, aby dodać sprzężenie do żądania SQL.

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

domyślnie Hibernuj dodaje połączenie wewnętrzne. Na lewej przyłączyć

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

JoinType.LEFT_OUTER_JOIN może być używany z Hibernate 5 (może hibernacji 4)

można przypisać alias do podmiotu głównego. Może z takich przykładów jest bardziej jasne

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