Hibernate_HQL

本文介绍了Hibernate的查询语言HQL,包括其与SQL的区别,如面向对象查询和关键字不区分大小写。详细阐述了HQL的四种返回值类型:String/long、Object[]、对象/集合以及Map集合,并提供了示例代码。同时,展示了如何设置占位符以及封装基于Hibernate的通用查询方法,解决了参数设置和分页问题。最后提出了对Hibernate中Session工作原理的疑问。
摘要由CSDN通过智能技术生成

目录

一、概念

二、HQL和SQL的区别

三、使用

1、根据返回值类型分类

①String/long

②Object[ ]

③对象/集合

④Map集合

2、设置站位符

四、封装基于Hibernate框架的通用查询

五、疑问


一、概念

HQL(Hibernate Query Language)是支持面对对象的一种查询语句,和SQL非常相似。

二、HQL和SQL的区别

①SQL查询表和表中的列,HQL查询对象和对象属性

②HQL的关键字不区分大小写,类名和属性区分大小写

③HQL可以省略SELECT

三、使用

1、根据返回值类型分类

①String/long

    /**
	 * 如果单个查询,返回单个字段可以用String接收
     * 如果是count(*)之类的可以用long类型接收
	 */
	public void testList1() {
		Query query = session.createQuery("select b.bookName as bname from Book b");
		List<String> list = query.list();
		for (String bname : list) {
			System.out.println(bname);
		}
	}

②Object[ ]

    /**
	 * 查两个列段及以上,默认返回的是Object[]
	 */
	public void testList2() {
		Query query = session.createQuery("select b.bookId,b.bookName from Book b");
		List<Object[]> list = query.list();
		for (Object[] o : list) {
			System.out.println(Arrays.toString(o));
		}
	}

③对象/集合

    /**
	 * 返回单个对象或者集合
	 */
	public void testList3() {
		Query query = session.createQuery("select new Book(b.bookId,b.bookName) from Book b");
		List<Book> list = query.list();
		for (Book b : list) {
			System.out.println(b);
		}
	}

注意:book必须要有相对应的构造函数!!!

④Map集合

    /**
	 * map是函数,所以不区分大小写,返回map集合
	 */
	public void testList4() {
		Query query = session.createQuery("select new mAp(b.bookId,b.bookName) from Book b");
		List<Map> list = query.list();
		for (Map b : list) {
			System.out.println(b);
		}
	}

这里可以直接获得Map集合,有时候在JS中也需要到Map集合格式的数据,这里也是一种方便了!

2、设置站位符

①SQL:select * from table where id =?    select * from table where id in(?,?,?...)

②HQL:from User u where u.id = :id          from User u where u.id in (:ids)

User:对象,id:属性,u:别名

如何设置站位符:

①SQL通过预编译对象进行设置

②HQL通过query进行设置

案例:

//单个设置
Query query = session.createQuery("from Book where bookId = :bookId");
query.setParameter("bookId", 1);
Book b = (Book) query.getSingleResult();
System.out.println(b);


//多个
Query query = session.createQuery("from Book where bookId in (:bookIds)");
query.setParameterList("bookIds", new Integer[] {1,2,4});

思考:通过这个设置占位符的方式可以观察出,可以通过对象的属性名称和对应的值来完成一个对

象(参数)的赋值!!!这个与通过前端请求获得的参数map集合相似!自定义mvc通用查询对占

位符进行赋值利用了反射,这里该怎么写呢?往后看

四、封装基于Hibernate框架的通用查询

package com.zwf.dao;
 
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
 
import org.hibernate.Session;
import org.hibernate.query.Query;
 
import com.zwf.hql.PageBean;
 
/**
 * 1、设置参数的问题 2、分页代码重复的问题
 * 
 * sql的通用分页的时候
 * 
 * getCountSql(sql) select count(1) from (sql) t
 * 
 * getCountHql(hql) hql = "from Book where bookName like :bookName" hql =
 * "select * from new Book(bid,bookName) where bookName like :bookName" select
 * count(1) hql
 * 
 * @author Administrator
 *
 */
public class BaseDao {
 
	/**
	 * 通用的参数设值方法
	 * 
	 * @param map
	 *            参数键值对集合
	 * @param query
	 *            预定义处理的hql对象
	 */
	public void setParam(Map<String, Object> map, Query query) {
		if (map != null && map.size() > 0) {
			Object value = null;
			Set<Entry<String, Object>> entrySet = map.entrySet();
			for (Entry<String, Object> entry : entrySet) {
				value = entry.getValue();
                //占位符的值有三种类型
				if (value instanceof Object[]) {
					query.setParameterList(entry.getKey(), (Object[]) value);
				} else if (value instanceof Collection) {
					query.setParameterList(entry.getKey(), (Collection) value);
				} else {
					query.setParameter(entry.getKey(), value);
				}
			}
		}
	}
 
    /**
     * 获得计算符合条件的数据总量的HQL
     */
	public String getCountHql(String hql) {
		// hql = "from Book where bookName like :bookName"
		// * hql = "select * from new Book(bid,bookName) where bookName like :bookName"
		int index = hql.toUpperCase().indexOf("FROM");
		return "select count(*) " + hql.substring(index);
	}
	
	/**
	 * 通用查询方法
	 * @param session
	 * @param map
	 * @param hql
	 * @param pageBean
	 * @return
	 */
	public List executeQuery(Session session,Map<String, Object> map,String hql,PageBean pageBean) {
		List list = null;
		if(pageBean != null && pageBean.isPagination()) {//分页
			String countHql = getCountHql(hql);
			Query countQuery = session.createQuery(countHql);
			this.setParam(map, countQuery);
			pageBean.setTotal(countQuery.getSingleResult().toString());
			
			Query query = session.createQuery(hql);
//			给预定义hql语句执行对象中的参数赋值,有多少赋值多少
			this.setParam(map, query);
			query.setFirstResult(pageBean.getStartIndex());
			query.setMaxResults(pageBean.getRows());
			list = query.list();
		}else {
			Query query = session.createQuery(hql);
//			给预定义hql语句执行对象中的参数赋值,有多少赋值多少
			this.setParam(map, query);
			list = query.list();
		}
		return list;
	}
 
}

五、疑问

HIbernate框架中的session具体起什么作业,工作流程是怎样的呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张同学_java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值