引用链接: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 中的各种运算符
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 =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
-
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(){} -
//.. -
}