`
ouly2
  • 浏览: 1281 次
社区版块
存档分类
最新评论

单个领域hibernate动态参数查询

阅读更多
使用此动态查询方法,不用每次都为一个带参的hibernate查询写一个查询,只需要用map传递参数即可,传递的参数map.key名必须与领域模型的属性名一致,如果不一致,则不会应用查询参数;多表连接查询等复杂推荐使用ibatis,但是使用hibernate最好设置为对象间关联,就可以在hibernate内事务内解决问题,不然事物配置很麻烦;
第一个为获取类的属性名的静态工具方法
第二个为动态查询方法,可写在抽象基类
余下为调用的示例方法
此代码写的粗糙,有不足及纰漏,望大家及时更贴斧正


package ly.tool.utils.ref;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;

import org.apache.log4j.Logger;

import com.jhzp.domain.Userinfo;
import com.jhzp.domain.base.BaseDomain;


public class ReflectUtils {

	private static Logger log=Logger.getLogger(ReflectUtils.class);
	
	public static void main(String[] args) throws IntrospectionException{
		System.out.println(listPropNames( Userinfo.class));;
	}
	/**
	 * 获取领域属性名列表
	 */
	public static List<String> listPropNames(Class clazz) {
		List<String> pnamel=new ArrayList<String>();
		BeanInfo bi;
		try {
			bi = Introspector.getBeanInfo(clazz);
			PropertyDescriptor[] pds = bi.getPropertyDescriptors();
	        for (int i = 0; i < pds.length; i++) {
	            String propName = pds[i].getName();
	            pnamel.add(propName);
	        }
	        return pnamel;
		} catch (IntrospectionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
	}
	
}


/**
	 * hibernate 动态参数查询 ,查询参数形式只能是: name=:name,
	 * 其他形式的查询使用自定义hql的查询queryByParamAndHql
	 */
protected List queryByParam(org.hibernate.Session session,Class dclazz,Map<String,Object> params){
		List<String> fnamel=ReflectUtils.listPropNames(dclazz);
		Set<String> pnames=params.keySet();
		List<String> pnamel=new ArrayList<String>();
		Iterator<String> iter=pnames.iterator();
		while(iter.hasNext()){
			String pname=iter.next();
			if(null!=params.get(pname) && fnamel.contains(pname)){
				pnamel.add(pname);
			}
		}
		String hql="from "+dclazz.getSimpleName();
		if(pnamel.size()>0){
			hql=hql+" where ";
		}
		StringBuilder sdb=new StringBuilder();
		sdb.append(hql);
		int count=0;
		for(String pname:pnamel){
			if(!fnamel.contains(pname)){
				log.info(" pname: "+pname+"参数跟属性名不同,返回了,fnamel列表: "+fnamel);
				return null;
			}
			
			if(count>0){
				sdb.append(" and "+ pname+" = :"+pname);
			}else
				sdb.append(pname+" = :"+pname);
			count++;
		}
		hql=sdb.toString();
		log.info("打印生成的hql: "+hql);
		Query query=session.createQuery(hql);
		for(String pname:pnamel){
			Object obj=params.get(pname);
			if(obj instanceof String){
				query.setParameter(pname, obj);
			}else if(obj instanceof BigDecimal){
				query.setBigDecimal(pname, ((BigDecimal)obj));
			}else if(obj instanceof BigInteger){
				query.setBigInteger(pname, ((BigInteger)obj));
			}else if(obj instanceof Boolean){
				query.setBoolean (pname, ((Boolean)obj));
			}else if(obj instanceof Byte){
				query.setByte(pname, ((Byte)obj));
			}else if(obj instanceof Calendar){
				query.setCalendar(pname, ((Calendar)obj));
			}else if(obj instanceof Date){
				log.info("应用到了"+Date.class);
				query.setDate(pname, ((Date)obj));
			}else if(obj instanceof Double){
				query.setDouble(pname, ((Double)obj));
			}else if(obj instanceof Integer){
				query.setDouble(pname, ((Integer)obj));
			}else if(obj instanceof Locale){
				query.setLocale(pname, ((Locale)obj));
			}else if(obj instanceof Long){
				query.setLong(pname, ((Long)obj));
			}else{
				query.setParameter(pname, obj);
			}
			
		}

/**
	 * 自定义hql,传递动态的参数
	 */
	protected List queryByParamAndHql(Session session,String hql,Map<String,Object> params){
		Query query=session.createQuery(hql);
		for(String pname:params.keySet()){
			if(hql.contains(pname)){
				Object obj=params.get(pname);
				if(obj instanceof String){
					query.setParameter(pname, obj);
				}else if(obj instanceof BigDecimal){
					query.setBigDecimal(pname, ((BigDecimal)obj));
				}else if(obj instanceof BigInteger){
					query.setBigInteger(pname, ((BigInteger)obj));
				}else if(obj instanceof Boolean){
					query.setBoolean (pname, ((Boolean)obj));
				}else if(obj instanceof Byte){
					query.setByte(pname, ((Byte)obj));
				}else if(obj instanceof Calendar){
					query.setCalendar(pname, ((Calendar)obj));
				}else if(obj instanceof Date){
					log.info("应用到了"+Date.class);
					query.setDate(pname, ((Date)obj));
				}else if(obj instanceof Double){
					query.setDouble(pname, ((Double)obj));
				}else if(obj instanceof Integer){
					query.setDouble(pname, ((Integer)obj));
				}else if(obj instanceof Locale){
					query.setLocale(pname, ((Locale)obj));
				}else if(obj instanceof Long){
					query.setLong(pname, ((Long)obj));
				}else{
					query.setParameter(pname, obj);
				}
			}
		}
		
		try {
			return query.list();
		} catch (Exception e) {
			e.printStackTrace();
			log.error("第二查询出错了。");
			return null;
		}
	}


/**
 * 被service调用代码片段:
 * /
@Transactional(readOnly=true)
	public List<Statistics> listStatistics(Map<String,Object> params) throws SQLException{
		return super.queryByParam(super.getHibernateSession(), Statistics.class, params);
	}

@Transactional(readOnly=true)
	public List<Statistics> listStatistics2(Date date) throws SQLException{
		String hql="from Statistics where atday =:atday";
		Query query=super.getHibernateSession().createQuery(hql);
		query.setDate("atday", date);
		return query.list();
	}


/**
 * 被control调用代码片段
 */
@RequestMapping(value="/tss/stc/listsaleno.html", method=RequestMethod.GET)
	public String listsaleno(HttpServletRequest hreq,ModelMap mm) throws SQLException{
		Map<String,Object> params=new HashMap<String,Object>();
		params.put("stype", "no");
		params.put("atday", new Date());
		List<Statistics> stcl= this.sts.listStatistics(params);
		mm.addAttribute("stcl", stcl);
		mm.addAttribute("stype", "no");
		return "tss/stc/stcs";
	}
/**
 * client 调用
 */
public static void main(String[] args) throws Exception {
	Calendar calendar = Calendar.getInstance();
	StatisticsTask task = (StatisticsTask) act.getBean("statisticsTask");
	StatisticsService sts=(StatisticsService) act.getBean("statisticsService");
	Map<String,Object> params=new HashMap<String,Object>();
	params.put("stype", "uc");
	params.put("atday", calendar.getTime());

	String hql="from Statistics where atday <:atday and stype=:stype";
	List<Statistics> stcl=sts.hlistStatisticsByHql(hql, params);
	log.info("统计的长度:"+stcl.size());
}

分享到:
评论

相关推荐

    Hibernate_query查询数据表中的一个字段.

    Hibernate_query查询数据表中的一个字段.

    mybatis 动态sql及参数传递

    目录 使用场景 动态标签 if标签 where标签 choose、when、otherwise 标签 ...if标签通常用那个胡where语句,update语句,insert语句中,通过判断参数值来决定是否使用某个查询条件,判断是否更新某一个字段或插入某个字段

    Hibernate Annotations 中文文档

    2.4.5. 关于单个关联关系的注解 2.4.5.1. 延迟选项和获取模式 2.4.6. 关于集合类型的注解 2.4.6.1. 参数注解 2.4.6.2. 更多的集合类型 2.4.7. 缓存 2.4.8. 过滤器 2.4.9. 查询 3. 通过XML覆写元数据 3.1. 原则...

    hibernate annotation 中文文档

    2.4.5. 关于单个关联关系的注解 2.4.5.1. 延迟选项和获取模式 2.4.6. 关于集合类型的注解 2.4.6.1. 参数注解 2.4.6.2. 更多的集合类型 2.4.7. 缓存 2.4.8. 过滤器 2.4.9. 查询 3. 通过XML覆写元数据 3.1. 原则 3.1.1...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     17.1.12 在HQL查询语句中绑定参数  17.1.13 设置查询附属事项  17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中调用函数  17.2 设定查询条件  17.2.1 比较运算  17.2.2 范围运算  17.2.3 ...

    Hibernate 高级配置

    1)、uniqueResult()方法,返回一个单个对象 2)、list()方法返回一个集合 3)、参数绑定 4)、setParameter()方法,绑定任意类型的参数 5)、setProperties()方法,把命名参数与一个对象的属性值绑定 3. Hibernate...

    Hibernate注释大全收藏

    Hibernate 使用 SQL Union 查询来实现这种策略。 这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @...

    精通Hibernate-孙卫琴

    相信不少人都看过孙卫琴的书吧!她的书很详细,很经典。如果你想用中国人的思维学好hibernate,那么就用它。共五册,一起下下来,然后解压,单个解压无效。

    Hibernate Validator实现更简洁的参数校验及一个util

    主要介绍了Hibernate Validator实现更简洁的参数校验及一个util,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    03_ibatis教程_查询指定id的单个对象.zip

    03_ibatis教程_查询指定id的单个对象.zip 03_ibatis教程_查询指定id的单个对象.zip

    Hibernate实体类生成器mysql版

    该工具是基于freemaker的hibernate实体类代码生成器,利用java的swing知识具有可视化界面,可以生成多个表,也可生成单个表,简单易操作。

    18-单个数码管模拟水流(51单片机C语言实例Proteus仿真和代码)

    18-单个数码管模拟水流(51单片机C语言实例Proteus仿真和代码)18-单个数码管模拟水流(51单片机C语言实例Proteus仿真和代码)18-单个数码管模拟水流(51单片机C语言实例Proteus仿真和代码)18-单个数码管模拟水流(51...

    hibernate annotation帮助文档

    2.4. Hibernate独有的注解扩展 2.4.1. 实体 2.4.2. 标识符 2.4.3. 属性 2.4.3.1. 访问类型 2.4.3.2. 公式 2.4.3.3. 类型 2.4.3.4. 索引 2.4.3.5. @Parent 2.4.3.6. 生成的属性 2.4.4. 继承 2.4.5. 关于...

    ibatis教程_查询指定id的单个对象

    ibatis教程_查询指定id的单个对象 ibatis教程_查询指定id的单个对象

    精通hibernate:对象持久化技术孙卫琴第二版part2

    Hibernate位于持久化层,是域模型和关系数据模型之间的桥梁。 1.1 应用程序的分层体系结构 1 1.1.1 区分物理层和逻辑层 2 1.1.2 软件层的特征 3 1.1.3 软件分层的优点 4 1.1.4 软件分层的缺点 4 1.1.5 Java...

    Spring+Spring mvc+Hibernate+Bootstrap、企业级员工信息管理系统

    01. 采用后台及前台的 Spring + Spring mvc + Hibernate + Bootstrap 02. 后台全注解式的开发(除了必要的spring和hibernate的xml配置以外) 03. 后台通过自定义注解结合一个访问拦截器实现整个系统的权限控制 04. ...

    C#线程多个参数

    C#线程多个参数 ,多个参数,单个参数,无参数。

    调用快递100接口单个查询和批量查询物流信息

    调用快递100接口单个查询和批量查询物流信息,可以查询最新的记录,和跟踪记录。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     17.1.12 在HQL查询语句中绑定参数  17.1.13 设置查询附属事项  17.1.14 在映射文件中定义命名查询语句  17.1.15 在HQL查询语句中调用函数  17.2 设定查询条件  17.2.1 比较运算  17.2.2 范围运算  17.2.3 ...

Global site tag (gtag.js) - Google Analytics