Hibernate的HQL,QBC 查询语言(包括多表联合查询join)
来源:互联网 发布:平刷王重庆时时彩软件 编辑:程序博客网 时间:2024/05/19 10:55
引用链接:http://takeme.iteye.com/blog/1722522
参考链接:
in和not in用法:http://blog.csdn.net/shiqidide/article/details/7327460 或 http://blog.csdn.net/shiqidide/article/details/7327460
Enum映射策略:http://blog.csdn.net/lmy86263/article/details/52650721?locationNum=11
多表查询:http://www.cnblogs.com/cyjch/archive/2012/03/14/2395340.html
个人应用实例
String hql = "from Notice as notice inner join notice.contract as contract join contract.accountManager as staff with staff.id =:id where notice.status =:status ";
List<Notice> list = noticeDao.findList(hql, new Parameter(new Object[][]{{"id", id}, {"status", NoticeTypeEnum.PLEDGE_START}}));
注意点:
- 若属性为Enum,则条件语句参数也要是Enum类,不能用int代替;
- join后的with条件语句一次只能带一个,否则会报错with-clause referenced two different from-clause elements
- where语句放在join语句之后,否则会报错无法识别token
Hibernate的HQL,QBC 查询语言(包括多表联合查询join)
链接:http://takeme.iteye.com/blog/1722522
1.HQL:(Hibernate Query Language) 是面向对象的查询语言
1.实体查询
2.有条件的 实体查询
3.HQL 中的各种运算符
运算符类型HQL运算符含义比较运算=等于 <>不等于 >大于 >=大于等于 <=小于等于 <小于 is null为空 is not null不为空范围运算in等于列表中的某一值(后面参数为List或者数组) not in不等于列表中的任意一个值 between p1 and p2大于等于值1 且 小于等于值2 not between p1 and p2小于值1 或者 大于 值2字符串模式匹配like字符串模式匹配逻辑运算and与 or或 not非
3.更新 删除
4.属性查询
5.使用函数
6.分组 与 排序
7.查询单个对象
8.绑定参数
释义:Hibernate中也采用了preparedStatement作为底层数据库的的访问方式,与之对应的SQL语句 可以重用preparedStatement对象, 首先会预编译,然后缓存起来,提高性能.
1.使用 ":"加参数名 绑定参数
2.使用 "?" 按照位置来绑定参数
3.采用setEntity() 将参数和一个持久化对象进行绑定
4.setParameter() 用于绑定任意类型的参数
5.setProperties() 将一个参数名 于一个对象的属性值绑定
10. 联合查询
1.实体查询
- public void testQueryAllDept(){
- String hql="from Employee";
- //hql="from com.sh.Entity";
- Query query=session.createQuery(hql);
- List<Employee> list= query.list();
- //...
- }
2.有条件的 实体查询
- public void testQueryAllDept(){
- String hql="from Deptas model where mode.deptName='人事部' ";
- //hql="from com.sh.Entity";
- Query query=session.createQuery(hql);
- List<Employee> list= query.list();
- //...
- }
- public void testQueryAllDept(){
- String hql="from Deptas model where mode.deptName like '%部%' ";
- //hql="from com.sh.Entity";
- Query query=session.createQuery(hql);
- List<Employee> list= query.list();
- //...
- }
- public void testQueryDeptByGt(){
- String hql="from Dept model where model.createDate> '2012-03-10'";
- Query query=session.createQuery(hql);
- List<Employee> list= query.list();
- }
3.HQL 中的各种运算符
运算符类型HQL运算符含义比较运算=等于 <>不等于 >大于 >=大于等于 <=小于等于 <小于 is null为空 is not null不为空范围运算in等于列表中的某一值(后面参数为List或者数组) not in不等于列表中的任意一个值 between p1 and p2大于等于值1 且 小于等于值2 not between p1 and p2小于值1 或者 大于 值2字符串模式匹配like字符串模式匹配逻辑运算and与 or或 not非
3.更新 删除
- public void testModifyDate(){
- Transaction tr=session.beginTransaction();
- Dept detp=(Dept)session.get(Detp.class,new Integer(6));
- detp.seteCreateDate("2000-03-10");
- tr.commit();
- }
- // delete 删除
- public void testDelDeptByHql(){
- Transaction tr=session.beginTransaction();
- String hql="delete Dept as model where model.deptId=6";
- Query query=session.createQuery(hql);
- query.executeUpdate();
- tr.commit();
- }
4.属性查询
- public void testQueryDeptName(){
- String hql="select model.deptName from Dept as model";
- Query query=session.createQuery(hql);
- List<String> deptNameList=query.list();
- //...
- }
- public void testQueryDeptName(){
- String hql="select model.deptName,model.createDate from Dept as model";
- Query query=session.createQuery(hql);
- List<Object[]> prsList=query.list();
- for(){
- }
- //...
- }
- //采用对象进行 保存 查询的字段(要添加 对应字段的构造方法)
- public void testQueryDeptName(){
- String hql="select new Dapt(model.deptName,model.createDate) from Dept as model";
- Query query=session.createQuery(hql);
- List<Dept> deptList=query.list();
- for(Dept d:deptList){
- d.setDeptName("test");
- session.saveOrUpdate(dept);
- }
- //...
- }
- //如果采用对象 保存上面查询出来的对象 如果对其进行更新的操作 是不会成功的
- public void testSaveDept(){
- Transction tr=session.beginTransactino();
- String hql="select new Dept(model.deptName,model.createDate) from Dept as model";
- Query query=session.createQuery();
- List<Dept> deptList=query.list();
- for(Dept dept:deptList){
- System.out.println(dept.deptName);
- dept.setDetpName("test");
- session.saveOrUpdate(dept);
- }
- tr.commit();
- // 最后 根本就没有更新 而是 在数据库中 插入 新的记录
- }
5.使用函数
- public void testQuyeryFunction(){
- String hql="select count(*),min(model.createDate) from Dept as model";
- Query query=session.createQuery(hql);
- List<Object[]> paramsList=query.list();
- for(){
- }
- //...
- }
6.分组 与 排序
- //排序
- public void testQueryOrderBy(){
- String hql="from Dept as mode order by model.createDate,model.deptName desc";
- Query query=session.createQuery();
- List<Dept> deptList=query.list();
- for(){}
- //
- }
- //分组 并且 使用 having 筛选
- public void testQueryGroupBy(){
- String hql="select count(model),model.deptName from Dept as model group by model.deptName having count(model)>1";
- Query query=session.createQuery();
- List<Object[]> list=query.list();
- //...
- }
7.查询单个对象
- public void testQueryUn(){
- String hql="select model.deptName from Dept as model where model.deptId=2";
- Query query=session.createQuery(hql);
- query.setMaxResults(1);
- String deptName=(String)query.uniqueResult();
- System.out.println(deptNamae);
- }
8.绑定参数
释义:Hibernate中也采用了preparedStatement作为底层数据库的的访问方式,与之对应的SQL语句 可以重用preparedStatement对象, 首先会预编译,然后缓存起来,提高性能.
1.使用 ":"加参数名 绑定参数
- public void testQueryByParamsName(){
- //使用 ":参数名" 来传递参数
- String hql="from Dept as model where
- odel.deptName=:deptName and model.createDate=:createDate";
- Query query=session.createQuery(hql);
- query.setString("deptName","test");
- query.setString("ceateDate","2000-02-10");
- List<Dept> deptList=query.list();
- for(){}
- //...
- }
2.使用 "?" 按照位置来绑定参数
- public void testQueryByParamsID(){
- String hql="from Dept as model where model.deptName=? and model.createDate=?";
- Query query=session.createQuery(hql);
- query.setString(0,"test");
- query.setString(1,"2000-02-02");
- List<Dept> list=query.list();
- for(){}
- //..
- }
3.采用setEntity() 将参数和一个持久化对象进行绑定
- public void testQueryByDept(){
- Dept dept=(Dept)Session.get(Dept.clas,new Integer(2));
- String hql="select Employee as model where model.dept=?"
- Query query=session.createQuery(hql);
- query.setEntity(0,dept);
- List<Employee> empList=query.list();
- for(){}
- //..
- }
4.setParameter() 用于绑定任意类型的参数
- public void testQueryBySetParams(){
- String hql="from Dept as model where model.deptName=?";
- Query query=session.createQuery(hql);
- query.setParameter(0,"test");
- List<Dept> deptList=query.list();
- for(){}
- //..
- }
5.setProperties() 将一个参数名 于一个对象的属性值绑定
- public void testQueryBySetPro(){
- Dept deptNew=new Dept();
- deptNew.setDeptName("test");
- String hql="from Dept as model where model.deptName=:deptName";
- Query query=session.createQuery();
- query.setProperties(deptNew);
- List<Dept> deptList=query.list();
- for(){
- }
- //..
- }
10. 联合查询
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
hql中join后跟的是主表的外联属性名,如:
from
Cat
as
cat inner
join
fetch cat.mate left
join
cat.kittens
(一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在
where
子句 (或其它任何子句)中。同时,相关联的对象 并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们)
inner join
- public void testQueryInnerJoin(){
- String hql="from Dept as model inner join model1.employees as model2";
- Query query=session.createQuery(hql);
- List<Object[]> objList=query.list();
- for(Object[] obj:objList){
- Dept dept=(Dept)obj[0];
- Employee emp=(Employee)obj[1];
- System.out.println("xxxx");
- }
- }
left join
- public void testQueryLeftJoin(){
- String hql="from Dept as model left join model1.employees as model2";
- Query query=session.createQuery(hql);
- List<Object[]> objList=query.list();
- for(Object[] obj:objList){
- Dept dept=(Dept)obj[0];
- Employee emp=(Employee)obj[1]; //有可能为空 所以需要判断
- if(mep!=null){
- System.out.println("xxxx");
- }else{
- System.out.println(null);
- }
- System.out.println(dept.getDeptName());
- }
- }
right join
- public void testQueryRightJoin(){
- String hql="from Dept as model right join model1.employees as model2";
- Query query=session.createQuery(hql);
- List<Object[]> objList=query.list();
- for(Object[] obj:objList){
- Dept dept=(Dept)obj[0];
- Employee emp=(Employee)obj[1]; //有可能为空 所以需要判断
- if(dept!=null){
- System.out.println(dept.getDeptName());
- }else{
- System.out.println(null);
- }
- System.out.println("dd"+emp.getEmployeeName());
- }
- }
11.子查询
- public void testQueryChild(){
- String hql="from Dept as model where (select count(*) from model.employee) >2";
- Query query=session.createQuery(hql);
- List<Dept> objList=query.list();
- for(){}
- //..
- }
12 Criteria 查询
释义:通过面向对象的设计将数据查询条件封装在一个对象
- //无条件
- public void testQueryDept(){
- Criteria criteria=session.createCriteria(Dept.class);
- List<Dept> deptList=criteria.list();
- for(){}
- //..
- }
- //添加条件
- public void testQueryDeptByName(){
- Criteria criteria=session.createCriteria(Dept.class);
- criteria.add(Expression.eq("deptName", "人事部"));
- List<Dept> deptList=criteria.list();
- for(){}
- //..
- }
SQL语法查询机制
方法描述Expression.eq对应sql中的field =valueExpression.gt对应sql中的field>valueExpression.ge对应sql中的field>=valueExpression.lt对应sql中的field<valueExpression.le对应sql中的field<=valueExpression.between对应sql中的betweenExpression.like对应 likeExpression.in对应 inExpression.eqProperty用于比较两个属性之间的值,对应的Sql条件中field=fieldExpression.gtProperty用于比较两个属性之间的值,对Sqlfiled>fieldExpression.geProperty用于比较两个属性之间的值,对应sql field>=fieldExpression.ltProperty用于比较两个属性之间的值,对应field<fieldExpression.leProperty用于比较 两个属性之间的值,对应field<=field
Hibernate3中采用Restrictions类代替Expression
- public void testQueryDeptByNameRe(){
- Criteria criteria=session.createCriteria(Dept.class);
- criteria.add(Restrictions.eq("deptName", "人事部"));
- List<Dept> deptList=criteria.list();
- for(){}
- //..
- }
Criteria中限定返回的行数
- public void testQueryDept(){
- Criteria criteria=session.createCriteria(Dept.class);
- criteria.setFirstResult(2);
- criteria.setMaxResults(2);
- List<Dept> deptList=criteria.list();
- for(){}
- //..
- }
Criteria排序
- public void testQueryDept(){
- Criteria criteria=session.createCriteria(Dept.class);
- criteria.addOrder(Order.asc("createDate"));
- List<Dept> deptList=criteria.list();
- for(){}
- //..
- }
0 0
- Hibernate的HQL,QBC 查询语言(包括多表联合查询join)
- Hibernate的HQL,QBC 查询语言(包括多表联合查询join)
- Hibernate 的HQL,QBC 查询语言
- Hibernate 的HQL,QBC 查询语言
- Hibernate:HQL/QBC查询语言比较的用法(1)
- Hibernate:HQL/QBC查询语言比较的用法(2)
- Hibernate:HQL/QBC查询语言比较的用法(1)
- Hibernate:HQL/QBC查询语言比较的用法(2)
- Hibernate:HQL/QBC查询语言比较的用法
- Hibernate 的HQL以及QBC 查询语言小结
- Hibernate里的HQL、QBC、SQL查询
- Hibernate的HQL、QBC、QBE查询总结
- Hibernate的QBC与HQL分页查询
- Hibernate:QBC查询语言
- Hibernate HQL,QBC查询 本地SQL查询
- Hibernate的QBC查询
- Hibernate的QBC查询
- HQL多表联合查询的问题
- B. Igor and his way to work
- 格雷码的递归生成
- MySQL数据和索引占用空间查询
- 监听软键盘的弹出与收起(近乎完美)
- trac,再爱你一次
- Hibernate的HQL,QBC 查询语言(包括多表联合查询join)
- 资料搬运 微信是如何处理弱网络
- 世界主要国家和地区及中国天气气象CSV/JSON/KML数据【免费下载】
- JAVA开发面试题(一)
- MYSQL
- JAVA开发面试题(二)
- js产生页面内的顺序序列号
- JS 解决跨域汇总
- Nginx的应用场景