Java 休眠在多对多列表上创建别名
我有四节课;UserGroup、UserAccount、Role、UserGroupRoRelation和my db是IBM DB2Java 休眠在多对多列表上创建别名,java,hibernate,db2,hibernate-annotations,hibernate-criteria,Java,Hibernate,Db2,Hibernate Annotations,Hibernate Criteria,我有四节课;UserGroup、UserAccount、Role、UserGroupRoRelation和my db是IBM DB2 @Entity @Table(name = "USER_GROUP") public class UserGroup implements Serializable { @Id @Column(name = "USER_GROUP_ID") @GeneratedValue private Long id; ...... ..
@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>();
}
@实体
@表(name=“USER\u GROUP”)
公共类UserGroup实现了可序列化{
@身份证
@列(name=“USER\u GROUP\u ID”)
@生成值
私人长id;
......
..
@OneToMany(mappedBy=“userGroup”,cascade=CascadeType.ALL,orphan=true)
private List userAccountsRole=new ArrayList();
}
@实体
@表(name=“ROLE”)
公共类角色实现可序列化{
@身份证
@列(name=“ROLE\u ID”)
@生成值
私人长id;
......
@OneToMany(mappedBy=“角色”)
private List useraccountinggroup=new ArrayList();
}
@实体
@表(name=“USER\u GROUP\u ROLE\u LINE”,uniqueConstraints=@UniqueConstraint(columnNames={“ROLE\u ID”,“USER\u GROUP\u ID”}))
公共类UserGroupRoleRelation{
@身份证
@生成值
@列(name=“relationship\u ID”)
私人长期关系;
@多个(级联=级联类型.ALL)
@JoinTable(name=“USER\u ACCOUNT\u USER\u GROUP\u ROLE\u LINE”,joinColumns={@JoinColumn(name=“relationshid”)},inverseJoinColumns={@JoinColumn(name=“USER\u ID”)},uniqueConstraints=@UniqueConstraint(columnNames={“USER\u ID”,“relationship\u ID”))
private List userAccountList=new ArrayList();
@许多酮
@JoinColumn(name=“USER\u GROUP\u ID”)
私有用户组用户组;
@许多酮
@JoinColumn(name=“ROLE\u ID”)
私人角色;
}
@实体
@表(name=“用户账户”)
公共类UserAccount实现可序列化{
@身份证
@列(name=“USER\u ID”)
@生成值
私人长id;
.....
@ManyToMany(mappedBy=“userAccountList”,cascade=CascadeType.ALL)
private List rolesInGroup=new ArrayList();
}
我想找到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();
}
@覆盖
@交易的
公共列表findUserGroupOf(用户帐户用户帐户){
Criteria=getSession().createCriteria(UserGroup.class);
createAlias(“userAccountsRole”、“userAccountsRole”);
添加(Restrictions.eq(“userAccountsRole.userAccountList”,userAccount));
返回条件。list();
}
但当我尝试获取该方法的结果时,DB2给了我DB2SQL错误:SQLCODE=-313,SQLSTATE=07004,SQLERRMC=null,DRIVER=3.63.75
可能是关于在多对多关系上创建别名。我不知道如何在多对多上创建别名。如何获得该函数的结果
谢谢这不是创建别名的原因。您正在将一个对象传递给hibernate,它无法对该对象制定任何条件。您需要为此创建双向映射。或者,如果您的需求只是获取特定用户组类的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();
}
@覆盖
@交易的
公共列表findUserGroupOf(长用户组ID){
Criteria=getSession().createCriteria(UserGroup.class);
添加(Restrictions.eq(“id”,userGroupId));
createAlias(“userAccountsRole”、“uar”);
setFetchMode(“uar.userAccountList”,FetchMode.JOIN);
返回条件。list();
}
这不是创建别名的原因。您正在将一个对象传递给hibernate,它无法对该对象制定任何条件。您需要为此创建双向映射。或者,如果您的需求只是获取特定用户组类的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();
}
@覆盖
@交易的
公共列表findUserGroupOf(长用户组ID){
Criteria=getSession().createCriteria(UserGroup.class);
添加(Restrictions.eq(“id”,userGroupId));
createAlias(“userAccountsRole”、“uar”);
setFetchMode(“uar.userAccountList”,FetchMode.JOIN);
返回条件。list();
}
@覆盖
@交易的
公共列表findUserGroupOf(用户帐户用户帐户){
Criteria=getSession().createCriteria(UserGroup.class);
createAlias(“userAccountsRole”、“userAccountsRole”);
createAlias(“userAccountsRole.userAccountList”、“userAccountList”);
添加(Restrictions.eq(“userAccountList.id”,userAccount.getId());
返回条件。list();
}
它对我有用。我指的是关于“身份”的标准。但我不明白为什么当有很多列表时,我不能检查对象的相等性而不是id
@交易的
公共列表findUserGroupOf(用户帐户用户帐户){
Criteria=getSession().createCriteria(UserGroup.class);
createAlias(“userAccountsRole”、“userAccountsRole”);
createAlias(“userAccountsRole.userAccountList”、“userAccountList”);
添加(Restrictions.eq(“userAccountList.id”,userAccount.getId());
返回条件。list();
}
它对我有用。我指的是关于“身份”的标准。但是我不明白为什么我不能在有很多列表的情况下检查object而不是id的相等性很抱歉,这就像查找useraccount的usergroup,而不是查找组的useraccount。我将提供一个useraccount,它将找到它的用户组。你能告诉我这是什么样的吗?很抱歉,这就像是在用户帐户中查找用户组,而不是在组中查找用户帐户。我将提供一个useraccount,它将找到它的用户组。你能告诉我它是什么样子吗?