Hibernate создать псевдоним на многие ко многим списку - PullRequest
1 голос
/ 24 марта 2012

у меня четыре класса;UserGroup, UserAccount, Role, 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

Вероятно, речь идет о создании псевдонима для отношения многих ко многим.Я не знаю, что я должен сделать, чтобы создать псевдоним для многих ко многим.Как я могу получить результат этой функции?

Спасибо

Ответы [ 2 ]

4 голосов
/ 25 марта 2012
    @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". Но я не понимаю, почему я не могу проверить равенство объекта вместо идентификатора, когда есть список ManyToMany

0 голосов
/ 24 марта 2012

Это не создание псевдонима.Вы передаете объект в спящий режим, по которому он не может выполнять никаких критериев.Для этого вам нужно создать двунаправленное сопоставление. В противном случае, если вам нужно просто получить список UserAccountList определенного класса UserGroup, вы можете следовать приведенному ниже коду.

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

}
...