您的位置:首页 > 其它

Hibernate的HQL,QBC 查询语言(包括多表联合查询join)

2017-04-24 03:26 471 查看
引用链接: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.实体查询 

Java代码  


public void testQueryAllDept(){  

String hql="from Employee";  

       //hql="from com.sh.Entity";  

Query query=session.createQuery(hql);  

  

List<Employee> list= query.list();  

  

//...  

}  

2.有条件的 实体查询 

Java代码  


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.更新 删除 

Java代码  


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.属性查询 

Java代码  


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.使用函数 

Java代码  


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.分组 与 排序 

Java代码  


//排序  

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.查询单个对象 

Java代码  


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.使用 ":"加参数名 绑定参数 

Java代码  


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.使用 "?" 按照位置来绑定参数 

Java代码  


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() 将参数和一个持久化对象进行绑定 

Java代码  


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() 用于绑定任意类型的参数 

Java代码  


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() 将一个参数名 于一个对象的属性值绑定 

Java代码  


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(等值连接) 只返回两个表中联结字段相等的行

hql中join后跟的是主表的外联属性名,如:
from
 
Cat
as
 
cat    
inner
join
 
fetch
cat.mate    left
join
 
cat.kittens

(一个fetch连接通常不需要被指定别名,
因为相关联的对象不应当被用在
where
 
子句
(或其它任何子句)中。同时,相关联的对象 并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们)

[/code]

inner join 

Java代码  


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 

Java代码  


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 

Java代码  


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.子查询 

Java代码  


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 查询 

释义:通过面向对象的设计将数据查询条件封装在一个对象 

Java代码  


//无条件  

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 =value
Expression.gt对应sql中的field>value
Expression.ge对应sql中的field>=value
Expression.lt对应sql中的field<value
Expression.le对应sql中的field<=value
Expression.between对应sql中的between
Expression.like对应 like
Expression.in对应 in
Expression.eqProperty用于比较两个属性之间的值,对应的Sql条件中field=field
Expression.gtProperty用于比较两个属性之间的值,对Sqlfiled>field
Expression.geProperty用于比较两个属性之间的值,对应sql field>=field
Expression.ltProperty用于比较两个属性之间的值,对应field<field
Expression.leProperty用于比较 两个属性之间的值,对应field<=field
Hibernate3中采用Restrictions类代替Expression 

Java代码  


public void  testQueryDeptByNameRe(){  

        Criteria  criteria=session.createCriteria(Dept.class);  

        criteria.add(Restrictions.eq("deptName", "人事部"));  

        List<Dept> deptList=criteria.list();  

        for(){}  

        //..  

          

    }  

Criteria中限定返回的行数 

Java代码  


public void testQueryDept(){  

        Criteria criteria=session.createCriteria(Dept.class);  

        criteria.setFirstResult(2);  

        criteria.setMaxResults(2);  

        List<Dept> deptList=criteria.list();  

        for(){}  

        //..  

    }  

Criteria排序 

Java代码  


public void testQueryDept(){  

        Criteria criteria=session.createCriteria(Dept.class);  

        criteria.addOrder(Order.asc("createDate"));  

        List<Dept> deptList=criteria.list();  

        for(){}  

        //..  

    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate hql 语言