public Date getHireDateEnd() { return hireDateEnd; } public void setHireDateEnd(Date hireDateEnd) { this.hireDateEnd = hireDateEnd; } public Date getHireDateStart() { return hireDateStart; } public void setHireDateStart(Date hireDateStart) { this.hireDateStart = hireDateStart; } }
(2)新建一个Tool类,完成把日期字符串转为java.util.Date类型
package util;
import java.text.SimpleDateFormat; publicclass Tool {
/**
* 把日期字符串转为java.util.Date类型 */
publicstatic java.util.Date strToDate(String dateStr,String parttern) throws Exception{ }
}
SimpleDateFormat sdf=new SimpleDateFormat(parttern); return sdf.parse(dateStr);
(3)编写测试类
publicclass test {
/**
* @param args */
publicstaticvoid main(String[] args) {
SessionFactory sessionFactory = null; Session session = null; try {
sessionFactory = new Configuration().configure()
.buildSessionFactory();
session = sessionFactory.openSession();
// 1. 准备查询条件,emoCondition对象封装条件
EmpCondition empCondition = new EmpCondition(); // 职位:CLERK
empCondition.setJob(\); // 工资大于1000
empCondition.setSalary(1000D);
// 入职开始时间:1981-4-1
empCondition.setHireDateStart(Tool.strToDate(\, // 入职结束时间:1985-9-9
empCondition.setHireDateEnd(Tool.strToDate(\,
\));
\));
// 2. 准备hql,hql根据条件动态生成
StringBuilder hql = new StringBuilder(\// 判断职位是否为空
if (null != empCondition.getJob()) { }
// 判断工资是否为空
if (null != empCondition.getSalary()) { }
// 判断入职开始时间是否为空
if (null != empCondition.getHireDateStart()) { }
// 判断入职结束时间是否为空
if (null != empCondition.getHireDateEnd()) { }
// 3. 依据hql构建query对象
Query query = session.createQuery(hql.toString());
// 4. 使用query对象的setProperties()方法为参数赋值,empCondition
hql.append(\); hql.append(\); hql.append(\); hql.append(\);
1=1 \);
对象中封装了条件
query.setProperties(empCondition); }
}
}
// 5. 执行查询,获取查询结果
Iterator
System.out.println(\员工编号为 :\ + it.next().getEmpNo()); }
e.printStackTrace(); if (session != null)
session.close();
} catch (Exception e) { } finally {
运行结果为:
下面调整示例6的查询添加,忽略第3个条件的入职结束时间
// 判断入职结束时间是否为空
if (null != empCondition.getHireDateEnd()) { }
hql.append(\);
注销以上代码,运行结果是
四、使用uniqueResult()方法获取唯一结果
使用Query接口提供的list()、iterate()方法获取查询结果集合,还可以使用uniqueResult()方法获取唯一的对象。
P148示例7
publicclass test {
/**
* @param args */
publicstaticvoid main(String[] args) {
SessionFactory sessionFactory = null; Session session = null; try {
}
}
sessionFactory = new Configuration().configure()
.buildSessionFactory();
session = sessionFactory.openSession();
// 设置占位符
String hql = \; Query query = session.createQuery(hql); // 为占位符赋值
query.setParameter(0, \);
// 获取唯一的部门
Dept dept = (Dept) query.uniqueResult();
System.out.println(\部门编号:\ + dept.getDeptNo()); } catch (Exception e) { }
e.printStackTrace(); if (session != null)
session.close();
} finally {
当查询结果不唯一是,不能使用query.uniqueResult()方法,否则会报以下错误信息。
修改代码:
// 获取部门 List
for(Dept dept:list){ }
System.out.println(\部门编号:\ + dept.getDeptName());
运行结果:
五、总结
上面介绍Hibernate的参数绑定机制,HQL参数绑定的两种形式: 方法一:按参数位置绑定 方法二:按参数名字绑定
setParameter()方法用于绑定任意类型的参数
setProperties()方法用于把命名参数与一个对象的属性值绑定,使用时注意命名参数和对象的属性匹配。
参数绑定对NULL是安全的,不会抛出异常 例如:我们将示例7修改
query.setParameter(0, \); 运行结果:
5.3分页和投影 一、实现数据分页查询
通过使用Query接口的setFirstResult(int firstResult)方法和setMaxResults(int maxResults)方法实现。
setFirstResult(int firstResult)方法:用于设置第一条记录的位置。 setMaxResults(int maxResults)方法:用于设置最大返回的记录条数。