`

Hibernate的HQL中,通过参数名称和参数值 ,封装成Map,查询

 
阅读更多

Hibernate的HQL中,通过参数名称和参数值 ,封装成Map。

 

在JavaBean中需要,返回一个Map集合的键值对形式。key->参数名,value->绑定查询的值。封装成Map 传入给后台.

代码如下:

package com.common.core.service;

import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class UserSearchCriteria implements SearchCriteria {

	private static final long serialVersionUID = -2410746683028614279L;
	final static Log logger = LogFactory.getLog(UserSearchCriteria.class);

	private String userId;
	private String firstName;
	private String lastName;
	private String email;
	private String age;
	private String gender;
	private String status;

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}
	
	public void reset(){
		this.userId = null;
		this.firstName = null;
		this.lastName = null;
		this.email = null;
		this.gender = null;
		this.status = null;
	}
	
	public Map<String,Object> getUserSearchCriteriaMap(){
		Map<String,Object> map = new HashMap<String, Object>();
		map.put("userId", "".equals(this.userId)?null:this.userId);
		map.put("lastName","".equals(this.lastName)?null:this.lastName);
		map.put("firstName","".equals(this.firstName)?null:this.firstName);
		map.put("age", "".equals(this.age)?null:this.age);
		map.put("email","".equals(this.email)?null:this.email);
		map.put("gender","".equals(this.gender)?null:this.gender);
		map.put("status","".equals(this.status)?null:this.status);
		return map;
	}
}

 

 

在service中,拿到bean中绑定好的参数名和值得map集合传入service中,并且调用DAO中的方法;

public List<User> getUserListPageByCriteria(UserSearchCriteria criteria,
			PageAttribute pga,Set<User> memberExistsUser)
			throws UserServiceException {
		
		// TODO Auto-generated method stub
		logger.info("Start getUserListPageByCriteria");
		final String endingMsg = "End getUserListPageByCriteria";
		logger.info("query record from "+pga.getStartIndex()+" to "+(pga.getStartIndex()+pga.getPageSize()));
		
		String hql = null;
		StringBuffer sb= new StringBuffer(" from User user where " +
				"(:firstName is null or user.firstName like concat(:firstName,'%') ) " +
				"and (:lastName is null or user.lastName like concat(:lastName,'%') ) " +
				"and (:age is null or user.age = :age) " +
				"and (:email is null or user.email = :email) " +
				"and (:gender is null or user.gender = :gender) " +
				"and (:status is null or user.status = :status) " +
				"and (:userId is null or user.userId = :userId) " );
			
		List<User> userList=null;
			try {
				if(memberExistsUser!=null && memberExistsUser.size()>0){
					sb.append("and ( user.userId not in ( ");
				
					for(User user:memberExistsUser){
						sb.append("'").append(user.getUserId()).append("'").append(",");
					}
					
					String resultStr= StringUtils.removeEnd(sb.toString(), ",")+"))";
					hql = resultStr;
				}else{
					hql = sb.toString();
				}
				
				Map<String,Object> paramMap = criteria.getUserSearchCriteriaMap();
				userList = userDao.getUserByQuery(paramMap, hql);
			} catch (DatabaseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				logger.error("GetUserListPageByCriteria exception",e);
				throw new UserServiceException("GetUserListPageByCriteria exception",e);
			}
			logger.info(endingMsg);
			return userList;
	}

 

 

   DAO封装好的方法如下:

/**
	 * Query records by query
	 * 
	 * @param map
	 * @param queryString
	 * @return
	 * @throws DatabaseException
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> getObjectsByQuery(final Map<String, Object> map,
			final String queryString) throws DatabaseException {
		log.info("Start Get objects by HQL query [" + queryString + "]");
		final String endingMsg = "End getObjectsByQuery";
		if (map == null)
			throw new IllegalArgumentException("Mapping is null");
		if (queryString == null)
			throw new IllegalArgumentException("Query String is null");
		List<T> list = null;

		try {
			String[] params = map.keySet().toArray(new String[map.size()]);
			Object[] values = map.values().toArray(new Object[map.size()]);
			list = this.getHibernateTemplate().findByNamedParam(queryString,
					params, values);
		} catch (HibernateException e) {
			log.logExceptionCaught(e);
			throw new DatabaseException(e);
		} finally {
			log.info(endingMsg);
		}
		return list;
	}

 

 

 

调用Hibernate中的底层方法;

 

public List findByNamedParam(final String queryString, final String[] paramNames, final Object[] values)
			throws DataAccessException {

		if (paramNames.length != values.length) {
			throw new IllegalArgumentException("Length of paramNames array must match length of values array");
		}
		return (List) executeWithNativeSession(new HibernateCallback() {
			public Object doInHibernate(Session session) throws HibernateException {
				Query queryObject = session.createQuery(queryString);
				prepareQuery(queryObject);
				if (values != null) {
					for (int i = 0; i < values.length; i++) {
						applyNamedParameterToQuery(queryObject, paramNames[i], values[i]);
					}
				}
				return queryObject.list();
			}
		});
	}

 

 

 

分享到:
评论

相关推荐

    Hibernate中分页查询的封装。

    本文将深入探讨如何在Hibernate中进行分页查询的封装,并提供相关的源码和工具使用方法。 首先,我们需要了解Hibernate中的Criteria查询,这是实现分页查询的一种方式。Criteria API允许我们以面向对象的方式构建...

    hibernate将本地SQL查询结果封装成对象(最终).zip

    本教程将详细解释如何使用Hibernate将本地SQL查询的结果封装成对象,以便更好地理解和应用这项技术。 1. Hibernate ORM简介: Hibernate是一个开源的ORM框架,它为Java应用程序提供了数据持久化的解决方案。它通过...

    HQL查询及语法

    - `select new map(p.name as personName) from Person as p`: 结果集被转换成Map集合,其中键是`personName`,值是每个`Person`对象的名字。 #### 四、HQL的优势 HQL通过将查询操作与对象模型紧密结合,极大地...

    hql查询语言语法

    `setString`方法用来设置HQL中的参数值。 ##### 2. 根据日期范围查询相关的个人 ```java List pl = sess.createQuery("from Person p where p.myEvents.happenDate between :firstDate and :endDate") .setDate(...

    hibernate所用到HQL经典语句大全

    使用`NEW Map(...)`可以将查询结果封装成`Map`对象,便于根据字段名称访问。 - **返回实体对象**: ```java String hql = "SELECT NEW Cat(c.name, c.createDate) FROM Cat c"; List&lt;Cat&gt; catList = session....

    超好用的hibernate查询工具类

    通过创建和使用这样一个超好用的Hibernate查询工具类,我们可以更高效地管理和操作数据库,降低开发复杂度,让开发者能够专注于业务逻辑,而不是底层的数据库交互。在大型项目中,这样的工具类是不可或缺的,它提升...

    java map转实体

    java map转实体可以利用java的反射去封装,于是就在hibernate的工具类下试着封装了下,封装完了之后感觉没必要,这完全就可以提取出来变成一个独立的工具类,而不仅仅局限于hibernate了,这样既可以满足一个hql查询...

    Hibernate通用分页.docx

    这个方法用于设置HQL查询中的参数,它遍历Map,根据值的类型(Collection、Object[] 或单一对象)调用相应的`setParameter`或`setParameterList`方法。 - **`getcountHql(String hql)`** 这个方法用于构建统计...

    常用的HQL语句下载

    在本文中,我们将深入探讨HQL(Hibernate Query Language),一种专为Hibernate ORM框架设计的查询语言,用于在Java应用程序中操作数据库。以下是一些常用HQL语句的使用与说明: 1. **HQL更新语句**: 更新操作...

    HibernateApi.zip

    1.2 Hibernate架构:主要包括配置文件(hibernate.cfg.xml)、实体类(Entity)、持久化接口(Session)和查询语言(HQL/SQL)等组件,提供了一套完整的数据访问解决方案。 二、Hibernate API关键组件 2.1 ...

    hibernate结构化查询

    在Java持久化框架Hibernate中,结构化查询是其强大功能之一,它允许开发者以面向对象的方式构建复杂的SQL查询。Criteria API就是实现这一功能的核心组件,它提供了一种更安全、可读性更强的方式来代替传统的HQL...

    hibernate课件

    在Hibernate中,Criteria查询是一种高级特性,它提供了一种更面向对象的方式来执行数据库查询,使得代码更加简洁和可读。 Criteria查询的核心在于创建一个Criteria实例,它实际上是对SQL查询的封装。例如,`...

    Hibernate中文参考手册

    Hibernate的核心是ORM(Object-Relational Mapping),它将复杂的SQL语句和数据库交互封装起来,使开发者可以专注于业务逻辑而不是底层的数据操作。Hibernate支持多种数据库,包括MySQL、Oracle、SQL Server等,具有...

    struts2整合hibernate

    Struts2和Hibernate是两种非常流行的Java Web开发框架,它们分别负责表现层和持久层的管理。Struts2是一款强大的MVC(Model-View-Controller)框架,它提供了丰富的动作和拦截器,使得Web应用的控制逻辑更加清晰。而...

    对Hibernate框架的二次封装,简化对数据库的操作

    对Hibernate进行二次封装是提升开发效率和代码质量的有效手段,通过设计良好的API和统一的异常处理,可以使团队更加高效地进行数据库操作。同时,封装还能提供扩展空间,以适应项目不断变化的需求。记住,好的封装...

    hibernate源代码的zip文件

    Session的get()和load()用于根据ID获取对象,query()和createNativeQuery()用于执行HQL和SQL查询。 六、懒加载与代理 Hibernate采用懒加载策略,延迟加载关联对象,直到真正使用时才加载。这通过代理机制实现,...

    hibernate+dao实例

    在实际的Hibernate操作中,Map经常用来映射一对多或多对一的关系,其中键是关联的主键,值是对应的对象。 总的来说,这个主题涵盖了Java开发中的重要技术,包括ORM工具Hibernate和设计模式DAO,它们都是构建可维护...

    hibernate基本功能

    - 设置参数:通过`q.setString("name", name)`和`q.setString("pwd", pwd)`设置查询参数。 - 执行查询:执行查询并检查返回的结果列表大小是否为0,如果结果集不为空,则表示登录成功。 - 提交事务:如果查询成功,...

    hibernate-3.2 源码

    通过阅读和分析Hibernate 3.2的源码,我们可以深入了解ORM框架的设计理念,学习如何优化数据库操作,以及如何在实际项目中灵活运用Hibernate提供的各种功能。同时,这也有助于我们掌握Java反射、代理、元数据解析等...

    hibernate-3.2源码包

    Hibernate提供了两种查询方式:Criteria API和HQL(Hibernate Query Language)。Criteria API允许动态构造查询,而HQL是一种面向对象的查询语言,类似于SQL。源码分析这些查询机制,有助于优化性能和编写更简洁的...

Global site tag (gtag.js) - Google Analytics