1

我有四个类;用户组,UserAccount,角色,UserGroupRoleRelation和我的数据库是IBM DB2休眠在很多列表上创建别名

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

我想找到一个useraccount的用户组,并准备我用标准的方法。就像是;

@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(); 

    } 

但是,当我试图让该方法的结果是,DB2给我DB2 SQL Error: SQLCODE=-313, SQLSTATE=07004, SQLERRMC=null, DRIVER=3.63.75

大概其对许多创建别名很多关系。我不知道我应该怎么做才能在许多对象上创建别名。我如何获得该功能的结果?

谢谢

回答

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(); 

    } 

这对我的作品。我的意思是“id”的标准。但我不明白为什么我不能检查对象上的平等而不是id当有ManyToMany列表

0

它不是创建别名。你传递一个对象到休眠状态,它不能做任何标准。您需要为此创建双向映射。或者,如果您的要求只是获取特定UserGroup类的UserAccountList的列表,则可以按照以下代码进行操作。

@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

对不起,这就像找到一个useraccount用户组,没有找到一个组的用户帐户。我会给一个useraccount,它会找到它的用户组。你能告诉它是什么样的吗? – 2012-03-24 17:19:45