多对多关系联合查询

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值