HibernateDaoSupport的 [ 查询 ] 方法总结
所有继承了HibernateDaoSupport类的类都可以使用以下方法操作数据库
一. 查询===========================================
1. List find(String queryString)
参数: queryString: hql语句, 不带条件
返回: List集合
功能: 不带条件查询列表
/** * 查询部门列表 * @return 部门列表 */ public List<Department> findAllDepartment() { String hql = "FROM Department"; return this.getHibernateTemplate().find(hql); }
2. List find(String queryString, Object value)
参数: queryString: hql语句; value: 单条件
返回: List集合
功能: 单条件查询
/** * 根据部门名称查询部门列表 * @param deptName 部门名称 * @return 部门列表 */ public List<Department> findDepartmentsByName(String deptName) { String hql = "FROM Department d WHERE d.name LIKE ?"; return this.getHibernateTemplate().find(hql, "%"+deptName+"%"); }
3. List find(String queryString, Object[] values)
参数: queryString: hql语句 ; values: 查询条件做成的Object[]数组
返回: List集合
功能: 多条件综合查询
/** * 根据部门名称和部门地址查询部门列表 * @param deptName 部门名称 * @param addr 部门地址 * @return 部门列表 */ public List<Department> findDepartmentsByNameAndAddr(String deptName, String addr) { String hql = "FROM Department d WHERE d.name LIKE ? AND d.addr LIKE ?"; Object []params = {"%"+deptName+"%", "%"+addr+"%"}; return this.getHibernateTemplate().find(hql, params); }
4. List findByCriteria(DetachedCriteria criteria)
参数: criteria: 离线查询条件的对象, 需要创建, 离线查询几乎能做所有事情[重要]
返回: List集合
功能: 离线查询, 不需要通过Session创建(相反地, Criteria是在线查询, 需要通过Session来创建对象), 离线查询可以非常自由地指定查询条件,
封装了很多SQL语句的功能, 比如: 排序, 大小比较, 分页, 模糊查询等等, 有时间要好好研究其底层的方法
/** * 离线查询 * @param deptName 部门名称 * @return 部门列表 */ public List<Department> findDeptsByDetachedCriteria(String deptName) { // 创建离线查询对象, 这里通过forClass来获取, 也可以通过其他方式, 具体请问度娘 DetachedCriteria dCriteria = DetachedCriteria.forClass(Department.class); // 传入部门名称进行模糊查询, Restrictions中有很多方法, 用于给定查询条件的比较指令, 比如大于/小于/等于... // MatchMode用于放置查询条件的位置, 请看下面的解释 dCriteria.add(Restrictions.like("name", deptName, MatchMode.ANYWHERE)); return this.getHibernateTemplate().findByCriteria(dCriteria); }
Hibernate 查询MatchMode的四种模式:
MatchMode.START:字符串在最前面的位置.相当于"like 'key%'" MatchMode.END:字符串在最后面的位置.相当于"like '%key'" MatchMode.ANYWHERE:字符串在中间匹配.相当于"like '%key%'" MatchMode.EXACT:字符串精确匹配.相当于"like 'key'"
5. List findByCriteria(DetachedCriteria criteria, int firstResult, int maxResults)
参数: criteria: 离线查询对象 ; firstResult: 从查询结果集中开始截取的索引, 从0开始; maxResults: 从查询结果集中结束截取的索引
返回: List集合
功能: (1)先使用criteria进行离线查询 ; (2) 从(1)的查询结果集中从索引firstResult开始截取, 直到maxResults结束, 常用于分页查询
/** * 离线查询 * @param deptName 部门名称 * @return 部门列表 */ public List<Department> findDeptsByDetachedCriteria(String deptName) { // 创建离线查询对象, 这里通过forClass来获取, 也可以通过其他方式, 具体请问度娘 DetachedCriteria dCriteria = DetachedCriteria.forClass(Department.class); // 传入部门名称进行模糊查询, Restrictions中有很多方法, 用于给定查询条件的比较指令, 比如大于/小于/等于... // MatchMode用于放置查询条件的位置, 请看下表 dCriteria.add(Restrictions.like("name", deptName, MatchMode.ANYWHERE)); return this.getHibernateTemplate().findByCriteria(dCriteria, 3, 6); // 这里的代码写的不对, 应该把3和6作为变量从action传到dao }
6. List findByExample(Object exampleEntity)
参数: exampleEntity: 封装了查询条件的实例对象
返回: List集合
功能: 将查询条件封装到实例对象中进行查询, 相当于this.name = ? 进行查询
/** * 根据实例查询部门列表 * @return 部门列表 */ public String findDepartByExample() { // 接收部门名称 String deptName = ServletActionContext.getRequest().getParameter("name"); // 将部门名称绑定到部门对象中 Department dept = new Department(); dept.setName(deptName); // 调用方法, 将实例传入进行查询 List<Department> departments = departmentService.findDepartByExample(dept); // 将查询结果集放入栈顶 ActionContext.getContext().getValueStack().set("departments", departments); return "findDepartByExample"; }
7. List findByExample(Object exampleEntity, int firstResult, int maxResults)
参数: exampleEntity: 封装了查询条件的实例对象 ; firstResult: 从查询结果集中截取的开始索引 ; maxResults: 从查询结果集中截取的结束索引
返回: List集合
功能: 从查询结果集中截取一定范围的结果集, 常用于分页查询, 相当于: where this_.name = ? limit firstResult, maxResults
Action:
/**
* 根据实例查询部门列表
* @return 部门列表
*/
public String findDepartByExample() {
// 接收部门名称
String deptName = ServletActionContext.getRequest().getParameter("name");
// 将部门名称绑定到部门对象中
Department dept = new Department();
dept.setName(deptName);
// 调用方法, 将实例传入进行查询
List<Department> departments = departmentService.findDepartByExample(dept);
// 将查询结果集放入栈顶
ActionContext.getContext().getValueStack().set("departments", departments);
return "findDepartByExample";
}
Dao:
public List<Department> findDepartByExample(Object exampleEntity) {
return this.getHibernateTemplate().findByExample(exampleEntity, 1, 3); // 这里的代码写的不对, 应该把1和3作为变量从action传到dao
}
8. List findByExample(String entityName, Object exampleEntity) , 这个方法和第 7 个差不多, 建议用第 7 个
参数: entityName: 类名 ; exampleEntity: 类对象
返回: List集合
功能: 根据绑定了属性的类对象查询集合
/** * 根据实例查询部门列表 * @return 部门列表 */ public String findDeptByExample() { // 接收部门名称 String deptName = ServletActionContext.getRequest().getParameter("name"); // 将部门名称绑定到部门对象中 Department dept = new Department(); dept.setName(deptName); // 调用方法, 将实例传入进行查询 List<Department> departments = departmentService.findDeptByExample(Department.class.getName(), dept); // 将查询结果集放入栈顶 ActionContext.getContext().getValueStack().set("departments", departments); return "findDepartByExample"; }
9. List findByExample(String entityName, Object exampleEntity, int firstResult, int maxResults), 和8是方法重载
参数: firstResult: 开始索引, maxResults: 结束索引 [索引从0开始计算]
返回: List集合
功能: 同8, 是方法重载, 带分页查询, 同理, 使用第 7 个就好
/** * 根据实例查询部门列表 * @return 部门列表 */ public String findDeptByExample() { // 接收部门名称 String deptName = ServletActionContext.getRequest().getParameter("name"); // 将部门名称绑定到部门对象中 Department dept = new Department(); dept.setName(deptName); // 调用方法, 将实例传入进行查询 int firstResult = 2; // 这两个参数要从前端传过来 int maxResults = 5; List<Department> departments = departmentService.findDeptByExample(Department.class.getName(), dept, firstResult, maxResults); // 将查询结果集放入栈顶 ActionContext.getContext().getValueStack().set("departments", departments); return "findDepartByExample"; }
10. List findByNamedParam(String queryString , String[] paramNames , Object[] values)
参数: queryString: hql语句 ; paramName: 查询条件的key值数组 ; value: 查询字条件的value值数组
返回: List集合
功能: 传入多个条件进行查询, 但只要有一个条件不满足就没有查询结果 [这个示例有问题: 查不到任何记录, 如果values数组中有Integer类型数据就会出现类型转换错误, 暂时记录下来, 以后再测试]
Action:
/**
* 多条件查询
*/
public String findByNamedParam() {
// 获取查询条件的值
HttpServletRequest request = ServletActionContext.getRequest();
String addr = request.getParameter("addr");
String deptName = request.getParameter("name");
// 这里代码写的不好, 应该将查询条件入参传入到service进行业务逻辑的处理,
// action只接收前端的参数并做简单校验, service做业务逻辑处理, dao只管执行
Object []values = {"%"+addr+"%", "%"+deptName+"%"};
// 查询, 返回
List<Department> departments = departmentService.findByNamedParam(values);
request.setAttribute("departments", departments);
return "findByNamedParam";
}
DAO:
public List<Department> findByNamedParam(Object[] values) {
// hql
String hql = "FROM Department d WHERE d.name LIKE :myName AND addr LIKE :myDddr";
String []paramNames = {"myName", "myDddr"}; // 查询条件的key值数组
// 将查询条件的key值数组和查询条件的value值数组都入参查询
return this.getHibernateTemplate().findByNamedParam(hql, paramNames, values);
}
11. List findByNamedParam(String queryString , String paramName , String value)
参数: 同10, 不同的是这个方法是基于单个条件的查询
返回: List集合
功能: 单条件查询
/** * 单条件查询 , 根据部门名称查询部门列表 */ public String findByNamedParam() { // 获取查询条件的值 HttpServletRequest request = ServletActionContext.getRequest(); String deptName = request.getParameter("name"); // 查询, 返回 List<Department> departments = departmentService.findByNamedParam(deptName); request.setAttribute("departments", departments); return "findByNamedParam"; }
public List<Department> findByNamedParam(String value) { // hql String hql = "FROM Department d WHERE d.name LIKE :myName"; String paramName = "myName"; // 将查询条件的key值数组和查询条件的value值数组都入参查询 return this.getHibernateTemplate().findByNamedParam(hql, paramName, "%"+value+"%"); }
12. List findByNamedQuery(String queryName)
参数: queryName:
返回: List集合
功能: 使用实体类的映射文件*.hbm.xml的query节点的name属性名作为findByNamedQuery方法的参数入参查询,
此方法不可传入参数, 或者传入参数只能在配置文件中写死, 跟不传参没有本质区别, 可以使用它的重载方法
Action: /** * 调用Department.hbm.xml文件的query的name属性查询 */ public String findByNamedQuery() { List<Department> departments = departmentService.findByNamedQuery(); ActionContext.getContext().getValueStack().set("departments", departments); return "findByNamedQuery"; }
Dao:
public List<Department> findByNamedQuery() {
return this.getHibernateTemplate().findByNamedQuery("findAllDepts");
}
Department.hbm.xml:
<hibernate-mapping>
<class>
........
</class>
<!-- 查询, name属性名称将被调用 -->
<query name="findAllDepts">
<![CDATA[
FROM Department
]]>
</query>
</hibernate-mapping>
13. List findByNamedQuery(String queryName, Object value) , 第 12 的重载方法
参数: queryName: 映射文件中的query节点的name属性值, value: 绑定的 ? 值
返回: List集合
功能: 单条件查询
Action: /** * 调用Department.hbm.xml文件的query的name属性查询, 单条件查询 */ public String findByNamedQuery() { HttpServletRequest request = ServletActionContext.getRequest(); String deptName = request.getParameter("name"); // findDepartmentByName是Department.hbm.xml中query节点的name属性值, 这里用模糊查询 List<Department> departments = departmentService.findByNamedQuery("findDepartmentByName", "%"+deptName+"%"); request.setAttribute("departments", departments); return "findByNamedQuery"; }
DAO: public List<Department> findByNamedQuery(String queryName, String value) { return this.getHibernateTemplate().findByNamedQuery(queryName, value); }
Department.hbm.xml: <!-- 查询, name属性名称将被调用 --> <query name="findDepartmentByName"> <![CDATA[ FROM Department WHERE name LIKE ? ]]> </query>
14. List findByNamedQuery(String queryName, Object[] values) , 第 12 的重载的方法
参数: values: 查询条件, 可以绑定多个查询条件
返回: List集合
功能: 多条件查询
Action: /** * 调用Department.hbm.xml文件的query的name属性查询, 多条件查询 */ public String findByNamedQuery() { HttpServletRequest request = ServletActionContext.getRequest(); String deptName = request.getParameter("name"); String addr = request.getParameter("addr"); // 拼成String数组 // 这里的代码写的不好, 应该把deptName和addr两个参数入参, 传到service层在拼成Object[]数组 Object []values = {"%"+deptName+"%", "%"+addr+"%"}; // findDepartmentByName是Department.hbm.xml中query节点的name属性值, 这里用模糊查询 List<Department> departments = departmentService.findByNamedQuery("findDepartmentByNameAndAddr", values); request.setAttribute("departments", departments); return "findByNamedQuery"; }
DAO: public List<Department> findByNamedQuery(String queryName, Object []values) { return this.getHibernateTemplate().findByNamedQuery(queryName, values); }
Department.hbm.xml: <!-- 查询, name属性名称将被调用 --> <query name="findDepartmentByNameAndAddr"> <![CDATA[ FROM Department WHERE name LIKE ? AND addr LIKE ? ]]> </query>
15. List findByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values)
参数: 第 12 的重载方法, paramNames: 绑定的":"参数(key), values: 查询条件值(value)
返回: List集合
功能: 绑定方式的多条件查询[ 经测试,下面代码有问题, 报错:Remember that ordinal parameters are 1-based! Position: 1, 待解决! ]
Action: /** * 调用Department.hbm.xml文件的query的name属性查询, 多条件查询 */ public String findByNamedQuery() { HttpServletRequest request = ServletActionContext.getRequest(); String deptName = request.getParameter("name"); String addr = request.getParameter("addr"); // 拼成String数组 // 这里的代码写的不好, 应该把deptName和addr两个参数入参, 传到service层在拼成Object[]数组 Object []values = {"%"+deptName+"%", "%"+addr+"%"}; String []paramNames = {"myName", "myAddr"}; // findDepartmentByName是Department.hbm.xml中query节点的name属性值, 这里用模糊查询 List<Department> departments = departmentService.findByNamedQuery("findDepartmentByNameAndAddr", paramNames, values); request.setAttribute("departments", departments); return "findByNamedQuery"; }
DAO: public List<Department> findByNamedQuery(String queryName, String []paramNames, Object []values) { return this.getHibernateTemplate().findByNamedQuery(queryName, paramNames, values); }
Department.hbm.xml: <!-- 查询, name属性名称将被调用 --> <query name="findDepartmentByNameAndAddr"> <![CDATA[ FROM Department WHERE name LIKE :myName AND addr LIKE :myAddr ]]> </query>
重载: List findByNamedQueryAndNamedParam(String queryName, String paramName, Object value)
16. List findByNamedQueryAndValueBean(String queryName, Object valueBean)
参数:queryName: *.hbm.xml中query节点的name值, valueBean: POJO类对象
返回: List集合
功能: 通过POJO封装查询条件
测试有问题, 等待验证....
17. Object get(Class entityClass, Serializable id) ======= 和load的区别
get: 如果缓存中没有该对象, 则会去数据库中获取一个初始化好的对象, 性能较load低, 相当于立即加载
load: 如果缓存中没有该对象, 则不会去数据库获取, 只有调用getXxx()方法(getId()除外)的时候才会去加载, 性能较好, 相当于延迟加载
参数: entityClass: 类.class, id: 主键
返回: POJO类对象
功能: 根据主键查询对象
Action:
public String get() {
// 接收参数
HttpServletRequest request = ServletActionContext.getRequest();
Integer deptId = Integer.parseInt(request.getParameter("deptId"));
// 调用方法查询
Department department = departmentService.get(Department.class, deptId);
// 返回
request.setAttribute("department", department);
return "get";
}
DAO:
public Department get(Class<Department> clazz, Integer deptId) {
return this.getHibernateTemplate().get(clazz, deptId);
}
重载方法:
1. Object get(Class entityClass, Serializable id, LockMode lockMode) : LockMode, 锁机制
2. Object get(String entityName, Serializable id) : 一样的用法
3. Object get(String entityName, Serializable id, LockMode lockMode) : 一样的用法