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) : 一样的用法

posted @ 2017-05-13 21:00  半生戎马,共话桑麻、  阅读(456)  评论(0)    收藏  举报
levels of contents