重点:
- 1、hql和sql区别/异同;
- 2、处理返回的结果集
- 3、hql中使用占位符
- 4、hql分页
重点分析:
-
什么是hql
HQL是Hibernate Query Language的缩写查全部
-
hql和sql区别/异同
HQL SQL
类名/属性 表名/列名
区分大小写,关键字不区分大小写 不区分大小写
别名 别名
?,从下标0开始计算位置(hibernate5之后不支持) ?,从顺序1开始计算位置
:命名参数 不支持:命名参数
面向对象的查询语言 面向结构查询语言注1:QuerySyntaxException:book is not mapped
-
处理返回的结果集
3.1 单个对象
select没有逗号
3.2 Object[]
b.bookId, b.bookName
3.3 Map
new Map(b.bookId as bid, b.bookName as bname)
3.4 new 构造方法(attr1,attr2)
new Book(b.bookId, b.price) -
hql中使用占位符
4.1 ?占位符
从下标0开始计算位置
hibernate5之后不再支持?占位符
4.2 :命名参数
-
连接查询
-
聚合函数
(sum,avg,max,max,min,count) -
hql分页
int page = 2;// 页码:page
int row = 10;// 每页行数:rows
query.setFirstResult((page - 1) * row);// 设置起始记录下标
query.setMaxResults(row);// 设置返回的最大结果集
代码分享:
public class HibernateTest {
//定义公共的session
private Session session;
/*
* 默认开启session ,打开事务
*/
@Before
public void Before() {
session = SessionFactoryUtil.openSession();
}
/*
*默认关闭事务,关闭session
*/
@After
public void After() {
SessionFactoryUtil.closeSession();
}
/*
* 查询所有,结果返回对象
*/
@Test
public void getList() {
String hql = "from Book";
Query query = session.createQuery(hql);
List<Book> list = query.list();
for (Book b : list) {
System.out.println(b);
}
}
/*
* 结果方式2 :返回一列数据,用string类型
* 查数据库中的一列
* 数据库:在数据库中查询一列不区分大小写
* hql : 由于你查询的是实体类的属性,那么区分大小写。
*/
@Test
public void getList1() {
String hql = "select bookName from Book";
Query query = session.createQuery(hql);
List<String> list = query.list();
for (String s: list) {
System.out.println(s);
}
}
/*
*结果方式3: object[]
* 自定义mvc的EntityBaseDao中
* 数据库 8列
* 实体类 8列
*
* insert
* book b 赋值6个属性
*
* 如果查询不是完整的表,那么最好使用map集合
*/
@Test
public void getList2() {
String hql = "select bookName,bookId from Book";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] s: list) {
System.out.println(Arrays.toString(s));
}
}
/*
*结果方式:通过hibernate函数map去处理
* 函数不区分大小写
*/
@Test
public void getList3() {
String hql = "select new map(bookId,bookName) from Book";
Query query = session.createQuery(hql);
List<Map> list = query.list();
for (Map book : list) {
System.out.println(book);
}
}
/*
* 结果方式:通过构造方式进行查询
*/
@Test
public void getList4() {
/**
* resultset
* [西游记, 1]
* [红楼梦, 2]
* [水浒, 3]
* [三国演义, 4]
* [颤抖吧!阿部, 5]
* [微微一笑很倾城, 6]
* [颤抖吧!ET, 7]
*
* executeQuery(sql , pageBean ,Class)
* executeQuery(sql , pageBean ,Book.class (clz))
*
* while(rs.next)
{
clz.new Intance();
clz.fields;
clz.getconstruct(...arr[])//这是可变数组
}
*/
String hql = "select new Book(bookId,bookName) from Book";
Query query = session.createQuery(hql);
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
/**
* 占位符
* 从下标0开始计算位置
* hibernate5之后不再支持?占位符
*/
@Test
public void getList5() {
/*String hql = " from Book where bookId = :bid"; 查询单个对象*/
/* query.setParameter("bid", 2);
Book book = (Book) query.getSingleResult();
System.out.println(book);*/
String hql = " from Book where bookId in (:bids)";
Query query = session.createQuery(hql);
/*第一种方式
* List<Integer> bids = new ArrayList<>();
bids.add(2);
bids.add(4);
bids.add(6);
query.setParameterList("bids", bids);*/
query.setParameterList("bids", new Integer[] {2,4,6});
List list = query.list();
for (Object o : list) {
System.out.println(o);
}
}
/*
* 连表查询
* 查询订单表和订单项表中的订单名和订单项的id
*/
@Test
public void getList6() {
//类似 sql select * from
String hql = "select o.orderNo,oi.productId from Order o,OrderItem oi where o.orderId = oi.order.orderId";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] s: list) {
System.out.println(Arrays.toString(s));
}
}
/*
* 聚合函数(sum,avg,max,max,min,count)
*/
@Test
public void getList7() {
String hql = "select max(bookId) from Book";
Integer max = (Integer) session.createQuery(hql).getSingleResult();
System.out.println("max:"+max);
}
/*
* hql分页
* int page = 2;// 页码:page
* int row = 10;// 每页行数:rows
* select * from book limit 起始位置,偏移量
* query.setFirstResult((page - 1) * row);// 设置起始记录下标
* query.setMaxResults(row);// 设置返回的最大结果集
*要求一页查询3条数据
*查询第二页的数据
*/
@Test
public void getList8() {
String hql=" from Book";
Query query = session.createQuery(hql);
int page = 2;
int ofset = 3;
query.setFirstResult((page-1)*ofset);
query.setMaxResults(ofset);
List<Book> list = query.list();
for (Book b : list) {
System.out.println(b);
}
}
}