1

Ich habe vier Klassen; Usergroup, Useraccount, Rolle, UserGroupRoleRelation und meine db ist IBM DB2Hibernate erstellen Alias ​​auf viele zu viele Liste

@Entity 
@Table(name = "USER_GROUP") 
public class UserGroup implements Serializable { 

    @Id 
    @Column(name = "USER_GROUP_ID") 
    @GeneratedValue 
    private Long id; 
...... 
.. 
    @OneToMany(mappedBy = "userGroup", cascade = CascadeType.ALL, orphanRemoval = true) 
    private List<UserGroupRoleRelation> userAccountsRole = new ArrayList<UserGroupRoleRelation>(); 


} 




@Entity 
@Table(name = "ROLE") 
public class Role implements Serializable { 

    @Id 
    @Column(name = "ROLE_ID") 
    @GeneratedValue 
    private Long id; 

    ...... 

    @OneToMany(mappedBy = "role") 
    private List<UserGroupRoleRelation> userAccountInGroup = new ArrayList<UserGroupRoleRelation>(); 


} 


@Entity 
@Table(name = "USER_GROUP_ROLE_LINE", uniqueConstraints = @UniqueConstraint(columnNames = { "ROLE_ID", "USER_GROUP_ID" })) 
public class UserGroupRoleRelation { 

    @Id 
    @GeneratedValue 
    @Column(name = "RELATION_ID") 
    private Long relationId; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "USER_ACCOUNT_USER_GROUP_ROLE_LINE", joinColumns = { @JoinColumn(name = "RELATION_ID") }, inverseJoinColumns = { @JoinColumn(name = "USER_ID") }, uniqueConstraints = @UniqueConstraint(columnNames = { "USER_ID", "RELATION_ID" })) 
    private List<UserAccount> userAccountList = new ArrayList<UserAccount>(); 

    @ManyToOne 
    @JoinColumn(name = "USER_GROUP_ID") 
    private UserGroup userGroup; 

    @ManyToOne 
    @JoinColumn(name = "ROLE_ID") 
    private Role role; 
} 


@Entity 
@Table(name = "USER_ACCOUNT") 
public class UserAccount implements Serializable { 

    @Id 
    @Column(name = "USER_ID") 
    @GeneratedValue 
    private Long id; 
..... 

    @ManyToMany(mappedBy = "userAccountList", cascade = CascadeType.ALL) 
    private List<UserGroupRoleRelation> rolesInGroup = new ArrayList<UserGroupRoleRelation>(); 
} 

Ich möchte Benutzergruppen eines Benutzer-Account finden und ich bereit, ein Verfahren mit den Kriterien. es ist wie;

@Override 
    @Transactional 
    public List<UserGroup> findUserGroupOf(UserAccount userAccount) { 
     Criteria criteria = getSession().createCriteria(UserGroup.class); 
     criteria.createAlias("userAccountsRole", "userAccountsRole"); 
     criteria.add(Restrictions.eq("userAccountsRole.userAccountList", userAccount)); 
     return criteria.list(); 

    } 

Aber wenn ich versuche Ergebnis dieser Methode zu bekommen, gibt DB2 mir DB2 SQL Error: SQLCODE=-313, SQLSTATE=07004, SQLERRMC=null, DRIVER=3.63.75

Wahrscheinlich seine über Alias ​​Schaffung von vielen zu vielen Beziehung. Ich weiß nicht, was ich tun soll, um Alias ​​auf vielen zu vielen zu schaffen. Wie kann ich das Ergebnis dieser Funktion erhalten?

Thank

Antwort

4
@Override 
    @Transactional 
    public List<UserGroup> findUserGroupOf(UserAccount userAccount) { 
     Criteria criteria = getSession().createCriteria(UserGroup.class); 
     criteria.createAlias("userAccountsRole", "userAccountsRole"); 
     criteria.createAlias("userAccountsRole.userAccountList", "userAccountList"); 
     criteria.add(Restrictions.eq("userAccountList.id", userAccount.getId())); 
     return criteria.list(); 

    } 

Es funktioniert für mich. Ich meine Kriterien auf "id". Aber ich verstehe nicht, warum ich Gleichheit auf Objekt anstelle von ID nicht überprüfen kann, wenn es ManyToMany-Liste gibt

0

Es ist nicht Alias ​​schaffen. Sie übergeben ein Objekt an den Ruhezustand, für den es keine Kriterien festlegen kann. Sie müssen bidirektionales Mapping dafür erstellen. Andernfalls, wenn Sie nur die Liste der UserAccountList einer bestimmten UserGroup-Klasse abrufen möchten, können Sie den folgenden Code verwenden.

@Override 
@Transactional 
public List<UserGroup> findUserGroupOf(long userGroupId) { 
    Criteria criteria = getSession().createCriteria(UserGroup.class); 
    criteria.add(Restrictions.eq("id",userGroupId)); 
    criteria.createAlias("userAccountsRole", "uar"); 
    criteria.setFetchMode("uar.userAccountList",FetchMode.JOIN); 
    return criteria.list(); 

} 
+0

Es tut mir leid, es war wie das Finden von Usergroup eines Useraccount, nicht finden Useraccount einer Gruppe. Ich werde einen Useraccount geben und es wird seine Benutzergruppen finden. Kannst du erzählen, wie es ist? –