Hibernate查询

概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。

1.标准化对象查询(Criteria Query):以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation)

2.Hibernate语言查询(Hibernate Query Language,HQL):它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。Hibernate官方推荐使用HQL进行查询。

3.Native SQL Queries(原生SQL查询):直接使用数据库提供的SQL方言进行查询。


下面通过一个使用HQL语句并且使用Map集合传参的例子来体会:

/**
	 * 根据hql查询某个对象
	 * @param hql 查询语句
	 * @param params 查询条件
	 * @return
	 */
	public static  <T> T getByHql(String hql,Map<String, Object> params){
		
		/*创建Query对象【HibernateUtils为自定义的工具类】*/
		Query query = HibernateUtils.getSession().createQuery(hql);
		/*如果参数不为空*/
		if (params != null && !params.isEmpty()){
			/*遍历设置参数*/
			for (String key : params.keySet()){
				query.setParameter(key, params.get(key));
			}
		}
		/*获取查询结果的集合*/
		List<T> list = query.list();
		
		if (list != null && list.size() > 0){
			/*如果集合中有值的话,返回集合的第一个值,作为当前查询结果的对象返回*/
			return list.get(0);
		}
		/*如果没有值的话返回空*/
		return null;
	}

测试方法:

public static void findByHql(){
		
		/*查询语句*/
		String hql = "from User where uname =:name";
		/*存储查询参数的集合*/
		Map<String, Object> params = new HashMap<String, Object>();
		/*添加参数*/
		params.put("name", "李克强");
		
		/*查询出一个User对象*/
		User user = HibernateUtils.getByHql(hql, params);
		
		System.out.println(user.getUname());
	}

使用Hql实现分页,原理代码如下:

/*查询语句*/
				String hql = "from XXX";
				/*创建Query对象*/
				Query query = session.createQuery(sql);
				/*设置从哪一条开始取数据*/
				query.setFirstResult(20);
				/*设置每页显示多少条数据*/
				query.setMaxResults(10);

注:setFirstResult(XXX)表示设置从哪一条开始取数据,加入传入的参数为当前页page,那么应该是这样的:query.setFirstResult((page-1)*每页显示的数量);


分页工具类方法:

/**
	 * 根据hql按条件查询并分页
	 * @param hql 查询语句
	 * @param params 查询参数
	 * @param page 当前页
	 * @param rows 每页显示多少条数据
	 * @return 返回List集合
	 */
	public static <T> List<T>  findByHql(String hql,Map<String, Object> params,int page,int rows){
		
		/*创建Query对象*/
		Query query = HibernateUtils.getSession().createQuery(hql);
		
		/*如果参数不为空*/
		if (params != null && !params.isEmpty()){
			/*遍历集合,设置参数*/
			for (String key : params.keySet()){
				query.setParameter(key, params.get(key));
			}
		}
		
		/*设置从第几条开始取数据*/
		query.setFirstResult((page-1)*rows);
		/*设置每页显示都少条数据*/
		query.setMaxResults(rows);
		
		/*返回查询的结果集*/
		return query.list();
	}

测试类:

/**
	 * 分页测试
	 */
	public static void findScrollByHql(){
		
		/*查询语句*/
		String hql = "from User where uname =:name";
		/*存储查询参数的集合*/
		Map<String, Object> params = new HashMap<String, Object>();
		/*添加参数*/
		params.put("name", "李克强");
		/*查询出第二页,每页显示3条数据*/
		List<User> users = HibernateUtils.findByHql(hql, params, 2, 3);
		
		System.out.println(users.size());
	}

Criteria接口实现数据查询:

/**
	 * 通过标准查询接口查询
	 * @param name 查询参数
	 * @return
	 */
	public static List<User> findByCriteria(String name){
		
		/*创建Session*/
		Session session = HibernateUtils.getSession();
		/*创建Criteria查询对象*/
		Criteria cri = session.createCriteria(User.class);
		/*添加查询条件1*/
		cri.add(Restrictions.eq("uname", name));
		/*添加查询条件2*/
		//cri.add(Restrictions.eq("usex", "男"));
		
		List<User> users = cri.list();
		
		return users;
	}

添加条件:cri.add(Restrictions.eq("uname", name));eq表示等于即查询uname字段为name的结果,另外还有其他的一些常用的运算符,如下:

/*查询uname为name的值*/
		cri.add(Restrictions.eq("uname", name));
		/*查询模糊查询的值*/
		cri.add(Restrictions.like("uname", name));
		/*查询年龄小于20的值*/
		cri.add(Restrictions.lt("age", 20));
		/*查询年龄大于20的值*/
		cri.add(Restrictions.gt("age", 20));
		/*查询年龄大于等于20的值*/
		cri.add(Restrictions.ge("age", 20));
		/*查询年龄小于等于的值*/
		cri.add(Restrictions.le("age", 20));
		/*查询uname为空的值*/
		cri.add(Restrictions.isNull("uname"));
		/*查询uname不为空的值*/
		cri.add(Restrictions.isNotNull("uname"));



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值