一个项目允许多个雇员参加、每个雇员允许参加多个项目,所以项目和雇员的关系式多对多关系。
在关系型数据库中通常通过三张表来表示这种多对多关系。即:项目表记录项目信息、雇员表记录雇员信息、中间表记录雇员、项目关系。在中间表中项目id、雇员id作为联合主键。
建表sql语句如下:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `em`
-- ----------------------------
DROP TABLE IF EXISTS `em`;
CREATE TABLE `em` (
`eid` int(11) NOT NULL AUTO_INCREMENT,
`ename` varchar(20) DEFAULT NULL,
PRIMARY KEY (`eid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of em
-- ----------------------------
INSERT INTO `em` VALUES ('1', 'zhangsan');
INSERT INTO `em` VALUES ('2', 'lisi');
INSERT INTO `em` VALUES ('3', 'wangwu');
INSERT INTO `em` VALUES ('4', 'maliu');
-- ----------------------------
-- Table structure for `mid`
-- ----------------------------
DROP TABLE IF EXISTS `mid`;
CREATE TABLE `mid` (
`eid` int(11) NOT NULL DEFAULT '0',
`pid` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`eid`,`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of mid
-- ----------------------------
INSERT INTO `mid` VALUES ('1', '1');
INSERT INTO `mid` VALUES ('1', '2');
INSERT INTO `mid` VALUES ('2', '1');
INSERT INTO `mid` VALUES ('2', '2');
INSERT INTO `mid` VALUES ('3', '2');
-- ----------------------------
-- Table structure for `pro`
-- ----------------------------
DROP TABLE IF EXISTS `pro`;
CREATE TABLE `pro` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pname` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of pro
-- ----------------------------
INSERT INTO `pro` VALUES ('1', 'oa');
INSERT INTO `pro` VALUES ('2', 'erp');
INSERT INTO `pro` VALUES ('3', 'mail');
下面需求来了,要求查询出同时参加项目编号分别为1、2的人员信息。
sql语句如下:
select * from em where eid in (select rr.eid from ( select count(*) cun, eid from mid where pid in (1,2) group by eid) as rr where rr.cun>1)
Hiberante分页查询:
List<Em> ems= session.createCriteria(Em.
class
)
//必需创建一个别名,pros为Em中包 含的Pro的list.
.createAlias(
"pros"
,
"pros"
)
//id为传进来进行查询的项目ID
.add(Restrictions.eq(
"pros.id"
,new Integer(2)))
.list();