1、什么是hql?
hql 是hibernate查询语言,全称Hibernate Query Language。
- hql和sql区别/异同
注:QuerySyntaxException:book is not mapped
- 处理返回的结果集
实体类与配置文件就不贴了。
@Test
public void test() {
Session session = HibernateUtils.getSession();
Transaction beginTransaction = session.beginTransaction();
String sql="select count(*) from Book";
Query query = session.createQuery(sql);
/**
* list() 返回的是多个对象、
*
* 查询多个的hql语句与查询单个的hql语句返回的结果集都是大同小异的
*/
// List queryList = query.list();
queryList.stream().forEach(a -> System.out.println(Arrays.toString((Object[])a)));
// queryList.stream().forEach(System.out::println);
/**
* getSingleResult()返回的是一个对象
*/
Object obj = query.getSingleResult();
System.out.println(obj.getClass().getName());
System.out.println(obj);
/* 解释:使用hql语句根据id查询一个Book ,返回的是一个Book对象
* hql : from Book where book_id=1
*/
/* 解释:使用hql语句根据id查询一个Book的某个属性 , 返回的是一个String对象
* hql : select book_name from Book where book_id=1
*/
/*
* 解释: 使用hql语句根据id查询一个Book的多个属性 , 返回的是一个Object的数组
* hql : select book_name,price from Book where book_id=1
*/
/*
* 解释: 使用hql语句根据id查询一个Book的多个属性 , 返回的是一个Map集合
*
* hql : select new Map(book_name,price) from Book where book_id=1
* 如果不为map括号中的列设置别名,则默认的别人为从0开始的递增数字 : {0=西游记, 1=50.0}
*
* hql : select new Map(book_name as book_name,price as price) from Book where book_id=1
* 如果指定了别名,则Map中键值对中的健,就是你设置的别名 : {book_name=西游记, price=50.0}
*
*/
/*
* 解释:使用hql语句根据id查询一个Book的多个属性,返回一个Book对象
*
* hql : select new Book(book_name,price) from Book where book_id=1
* 这种new Book()的写法与Book实体类的构造器中的参数以及构造器中参数属性的顺序都是要一一对应的 ,
*/
beginTransaction.commit();
session.close();
}
- hql中使用占位符
@Test
public void test(){
Session session = HibernateUtils.getSession();
Transaction beginTransaction = session.beginTransaction();
String sql="from Book where book_id=:id";
// from Book where book_id in :ids
Query query = session.createQuery(sql);
query.setParameter("id", 1);
/*
* hql 中占位符的使用 :
* 一:hql中使用 = 号时
* 1、 在hql语句中定义占位符
* from Book where book_id=:id
*
* 2、为结果集中的占位符设置值
* query.setParameter("id", 1);
*
* 二:hql中使用 in 关键字时
* 1、在hql语句中定义占位符
* from Book where book_id in :ids
*
* 2、为结果集中的占位符设置值
* List<Integer> list=new ArrayList<>();
* list.add(1);
* list.add(2);
* query.setParameterList("ids", list);
*
*/
List queryList = query.list();
queryList.stream().forEach(System.out::println);
beginTransaction.commit();
session.close();
}
- 连接查询
@Test
public void test(){
Session session = HibernateUtils.getSession();
Transaction beginTransaction = session.beginTransaction();
String sql="select new Map(o.order_no as order_no, i.product_id as product_id) from Book as b,Category as c on b.book_id.categorys=c";
Query query = session.createQuery(sql);
/**
* list() 返回的是多个对象、
*
* 查询多个的hql语句与查询单个的hql语句返回的结果集都是大同小异的
*/
List queryList = query.list();
queryList.stream().forEach(System.out::println);
/**
* 连表查询的hql语句的写法:
* select new Map(o.order_no as order_no, i.product_id as product_id) from Book as b,Category as c on b.book_id.categorys=c
*
* 不指定返回类型的语句
* from Book as b,Category as c on b.book_id.categorys=c
*/
beginTransaction.commit();
session.close();
}
- 聚合函数
@Test
public void test(){
Session session = HibernateUtils.getSession();
Transaction beginTransaction = session.beginTransaction();
String sql="select count(*) from Book";
Query query = session.createQuery(sql);
/**
* getSingleResult()返回的是一个对象
*/
Object obj = query.getSingleResult();
System.out.println(obj.getClass().getName());
System.out.println(obj);
/**
* 聚合函数:
* sum、avg、max、min、count
* select count(*) from Book
*/
beginTransaction.commit();
session.close();
}
- hql分页
@Test
public void test(){
Session session = HibernateUtils.getSession();
Transaction beginTransaction = session.beginTransaction();
String sql="from Book";
Query query = session.createQuery(sql);
int page=2; //页码
int row=2; //每页行数
//设置分页
query.setFirstResult((page-1)*row); // 设置起始记录下标
query.setMaxResults(row); // 设置返回的最大结果集
/**
* list() 返回的是多个对象、
*
* 查询多个的hql语句与查询单个的hql语句返回的结果集都是大同小异的
*/
List queryList = query.list();
queryList.stream().forEach(System.out::println);
beginTransaction.commit();
session.close();
}