您的位置:首页 > 其它

Hibernate 的HQL,QBC 查询语言

2015-07-03 16:09 519 查看
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等于列表中的某一值
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. 联合查询

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(){}

//..

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