目录
一、概念
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具体起什么作业,工作流程是怎样的呢?