按主键查询
dao层
public Emp get(Serializable id){
//通过session的get方法根据加载指定对象
return (Emp)HibernateUtil.currentSession().get(Emp.class,id);
}
service层
public Emp findEmpById(Integer id){
Transaction tx=null;
Emp result =null;
try {
tx=HibernateUtil.currentSession().beginTransaction(); //开启事务
result=empDao.get(id); //调用Dao,根据OID加载指定对象
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
if(tx!=null)
tx.rollback(); //回滚事务
}
return result;
}
test测试类
public static void main(String[] args) {
EmpService empService = new EmpService();
//查询
Emp emp =empService.findEmpById(7788);
System.out.printf(emp.getEname()); }
使用HQL
什么是hql
hql查询是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念,hql语句中除了java类和属性名称外,查询语句对大小写敏感,
所以SELECT和select是相同的.但是cn.entity.emp和cn.entity.EMP.hql语句中的关键字建议使用小写字母.
编写hql
hql的语法跟我们数据库中写的语法差不多,需要注意的是hql中查询所有的列并不需要select关键字如下,最重要的一点是hql列对应的是类的中的字段名称,而不是数据库中的列
dao层
public List<Emp> findEmp(String job){
String hql = "from Emp";
Query query =HibernateUtil.currentSession().createQuery(hql);return query.list();
}
service层
public void findEmp(String job){
Transaction tx =null;
try {
tx=HibernateUtil.currentSession().beginTransaction();
List<Emp> emps = empDao.findEmp();
for (Emp e:emps) {
System.out.println(e.getEname());
}
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
}
}
这样即可把全表的数据读取出来,或者使用迭代器如下
public Iterator<Emp> findAll(){
String hql ="from Emp"; //定义hql
Query query = HibernateUtil.currentSession().createQuery(hql);
return query.iterate(); //执行查询
}
public Iterator<Emp> findAllEmps(){
Transaction tx=null;
Iterator<Emp> emps=null;
try {
tx=HibernateUtil.currentSession().beginTransaction(); //打开事务
emps=empDao.findAll(); //获取数据
Emp emp=null;
while (emps.hasNext()){ //判断是否遍历到末尾
emp=emps.next();
System.out.println("员工名称:"+emp.getEname());
}
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
if(tx!=null)
tx.rollback();
}
return emps;
}
在hql语句中绑定参数
query接口提供的绑定不同类型的参数的方法
- setBoolean():绑定Boolean类型的参数
- setByte():绑定byte类型的参数
- setDouble():绑定double类型的参数
- setDate():绑定util.Date类型的参数
- setString():绑定String类型的参数
两种语法:
- setXXX(下标,值)
- setXXX(参数名称,值)
如果需要使用setXXX(参数名称,值)进行绑定参数 如下:
String hql = "from Emp where job=:j";
Query query =HibernateUtil.currentSession().createQuery(hql);
query.setString("j",job);
如果是setXXX(下标,值)参数绑定 如下:
String hql = "from Emp where job= ?";
Query query =HibernateUtil.currentSession().createQuery(hql);
query.setString(1,job);
注意
setXXX(参数名称,值) 在hql中 需要使用 :自定义参数名称
setXXX(下标,值) 在hql中需要使用 ?
除了以上用于绑定特定类型参数的方法,hibernate还提供了setParameter()方法,用来绑定任意类型的参数.
public List<Emp> findDate(Emp hireDate){
String hql = "from Emp where hiretDate > :hiretDate"; // :hiretDate 的hiretDate是与emp类的hiretDate名字一致
Query query =HibernateUtil.currentSession().createQuery(hql);
query.setProperties(hireDate); //传参
return query.list();
}
分页和投影
hql中的分页非常简单,如下代码
public List<Emp> empPage(Integer start,Integer end){
String hql = "from Emp";
Query query =HibernateUtil.currentSession().createQuery(hql);
query.setFirstResult((start-1)*end); //设置页数
query.setMaxResults(end); //设置每页显示的数据
return query.list();
}
public void empPage(Integer start,Integer end){
Transaction tx=null;
try {
tx=HibernateUtil.currentSession().beginTransaction();
List<Emp> emps = empDao.empPage(start,end);
for (Emp e:emps) {
System.out.println(e.getEname());
}
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
if(tx!=null)
tx.rollback();
}
}
假设是第二页 查六笔数据如下结果
我们再来看下数据库中
投影
使用from 表名 表示查询表的所有列,使用SELECT 列1, 列2, 列3 from 表名
则可以仅返回指定列,这种操作称为投影。