【HELP】HQL语句面向对象多实体多表关联

现在有对象User,里面有属性roles;
[code="java"]
@Entity
@Table(name="USER_")
public class User implements Serializable{
private static final long serialVersionUID = 1L;

/** 用户编码 */
@Id
@GeneratedValue(generator="autoIncrement")
@GenericGenerator(name="autoIncrement",strategy="native")
private Long id;

/** 用户名 */
@Column(updatable=false,unique=true,length=30,nullable=false)
private String username;

 /** 用户状态,1:正常;0:失效;2:异常锁定 */

@Column(length=1,nullable=false)
private int status = 1;

/** 创建时间,系统自动生成;无法修改 */
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable=false,updatable=false)
private Date createDate;

/** 用户角色关联 */
@ManyToMany(fetch=FetchType.LAZY,targetEntity=Role.class)
@Cascade(value={CascadeType.SAVE_UPDATE,CascadeType.DELETE})
@JoinTable(name="DSS_IDAP_USERROLE",
joinColumns={@JoinColumn(name="USER_ID")},
inverseJoinColumns={@JoinColumn(name="ROLE_ID")},
uniqueConstraints={@UniqueConstraint(columnNames={"USER_ID","ROLE_ID"})}
)
private Set roles = new HashSet(0);
[/code]
Role对象,里面有属性resources;
[code="java"]
@Entity
@Table(name="ROLE_")
public class Role implements Serializable{

private static final long serialVersionUID = 1L;

/**角色编码*/

@Id
@GeneratedValue(generator="autoIncrement")
@GenericGenerator(name="autoIncrement",strategy="native")
private Long id;

/**角色名称*/
@Column(unique=true,length=30,nullable=false)
private String name;

/**角色资源*/
@ManyToMany(fetch=FetchType.LAZY,targetEntity=Resource.class)
@JoinTable(name="DSS_IDAP_ROLERESOURCE",
joinColumns={@JoinColumn(name="ROLE_ID")},
inverseJoinColumns={@JoinColumn(name="RES_ID")},
uniqueConstraints={@UniqueConstraint(columnNames={"ROLE_ID","RES_ID"})}
)
private java.util.Set resources;
[/code]
现在想通过用户的ID来找该用户可以访问的资源;
SQL语句可以写出来;但是HQL语句不知道怎么写,请大牛们给帮个忙。
根据User id 找到 user,得到用户的所有角色,再得到所有角色的对应的资源,去掉重复的资源。

2个回答

如果你的重复数据定义不是所有数据属性相同的话,那你可以重写roles和resources的equals方法。从而避免在Set<>时重复。

既然你是[quote]User id 找到 user,得到用户的所有角色,再得到所有角色的对应的资源[/quote]
那么不建议你配置多对多的功能。
你可以配置成 user 1..n role role 1..n resources
然后反向的 role 1..n user resources 1..n role

那么对于你的HQL,其实就只用写 from User where id = 1;就可以了。
要得到所有资源你只需要进行java遍历就可以

//以下为伪代码
[code="java"]User user = UserDao.get("from User where id = 1");

Set roles = user.getRoles()
for(role : roles){
Set resources = role.getResources();
for(resource : resources){
//要拿到的资源
}
}[/code]

至于你说的去重,因为你使用的Set而非list所有,本来查出来的数据就是没有重复的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!