HQL o->m & m<-->n

本文介绍了一种在实体关系映射中处理多对多关系的方法,通过使用join(left join fetch)来实现MenuGroup、MenuNode及EnterpriseDepartment之间的关联查询。具体展示了如何在Java实体类中定义这些关系,并给出了相应的HQL查询语句。
from MenuGroup mg

left join fetch mg.menuNodes mns

[color=red][b]join[/b][/color] mns.enterpriseDepartments eds

where mg.id=mns.menuGroup and eds.id = ?


from MenuGroup mg left join fetch mg.menuNodes mns 这句参见我的另外一个日志

多对多采用 [color=red][b]join(left join fetch)[/b][/color] ,并且不用id直连


实体关系如下(只写出关键的代码了,呵呵):

MenuGroup 与 MenuNode 一对多

MenuNode 与 EnterpriseDepartment 多对多(单向关系)

@Entity
@Table(name = "PERMISSION_MENU_GROUP")
public class MenuGroup implements AccessPermission,IntOrderable{
/**菜单所包含的菜单节点*/
private List<MenuNode> menuNodes = new ArrayList<MenuNode>();

@OneToMany(mappedBy="menuGroup")
@LazyCollection(LazyCollectionOption.FALSE)
public List<MenuNode> getMenuNodes() {
return menuNodes;
}
//略
}



@Entity
@Table(name = "PERMISSION_MENU_NODE")
public class MenuNode implements AccessPermission,IntOrderable{

/**企业会员部门*/
private List<EnterpriseDept> enterpriseDepartments=new ArrayList<EnterpriseDept>();

/**菜单所在组*/
private MenuGroup menuGroup;

@ManyToMany
@JoinTable(
name = "PERMISSION_MENUNODE_ENTER_DEPT",
joinColumns = {
@JoinColumn(name = "MENU_NODE_ID")
},
inverseJoinColumns = {
@JoinColumn(name = "ENTERPRISE_DEPARTMENT_ID")
})
@LazyCollection(LazyCollectionOption.FALSE)
public List<EnterpriseDept> getEnterpriseDepartments() {
return enterpriseDepartments;
}


@ManyToOne
@JoinColumn(name = "MENU_GROUP_ID",nullable=false)
public MenuGroup getMenuGroup() {
return menuGroup;
}


//略
}



@Entity
@Table(name = "ENTERPRISE_DEPT")
public class EnterpriseDept extends BasicDept{

//略

}

@MappedSuperclass
public abstract class BasicDept implements java.io.Serializable, ValueObject<BasicDept>,Identityable{

protected String id;


@Id
@Column(length = 32)
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
public String getId() {
return id;
}

//略
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值