一 为什么要学习hql(hibernate query language)
1 session的delete删除不能批量删除。
2 session的update不能批量修改。
3 sessin的load和get不能查询所有。
hql是官方推荐,功能强大。
二 HQL(Hibernate Query Language)
面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是表,并且支持多态;HQL主要通过Query来操作,Query的创建方式:
Query q = session.createQuery(hql);
from Person
from User user where user.name=:name
from User user where user.name=:name and user.birthday < :birthday
三 模拟一个学生选课系统 ,创建三张表
CREATE TABLE `course` (
`cid` int(11) NOT NULL,
`cname` varchar(50) NOT NULL,
`ccredit` int(11) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `student` (
`sid` int(11) NOT NULL,
`sname` varchar(45) NOT NULL,
`ssex` char(2) NOT NULL,
`sdept` varchar(10) NOT NULL,
`sage` int(11) DEFAULT NULL,
`saddress` varchar(45) DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `studcourse` (
`stuCourseId` int(11) NOT NULL AUTO_INCREMENT,
`sid` int(11) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
`grade` int(11) DEFAULT NULL,
PRIMARY KEY (`stuCourseId`),
KEY `sid` (`sid`),
KEY `cid` (`cid`),
CONSTRAINT `studcourse_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `student` (`sid`),
CONSTRAINT `studcourse_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `course` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
四 表的设计原则
hibernate设计者推荐我们在设计表的时候,应当每张表有一个主键,而且该主键最好不含业务逻辑,这样做的目的是为了保证表记录的稳定性。
例如:product表的设计好于product1表,因为productNo含有业务逻辑,如果产品号的命名规则发生变化,记录就存在不稳定性。
product 表(id为主键)
id productNo name price
1 bi001 冰箱 1000
2 nj111 电脑 2000
product1 表(productNo为主键)
productNo name price
bi001 冰箱 1000
nj111 电脑 2000