多对多关系联合查询

       一个项目允许多个雇员参加、每个雇员允许参加多个项目,所以项目和雇员的关系式多对多关系。

在关系型数据库中通常通过三张表来表示这种多对多关系。即:项目表记录项目信息、雇员表记录雇员信息、中间表记录雇员、项目关系。在中间表中项目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)))
                         .setFirstResult(0)
                         .setMaxResult(2)
                          .list();

猜你喜欢

转载自lichun01.iteye.com/blog/1973573