1. 什么是hql
HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。
2. hql和sql区别/异同
HQL | SQL |
---|---|
类名/属性 | 表名/列名 |
区分大小写,关键字不区分大小写 | 不区分大小写 |
别名 | 别名 |
:命名参数 | 不支持:命名参数 |
?,从下标0开始计算位置(hibernate5之后不支持) | ?,从顺序1开始计算位置 |
面向对象的查询语言 | 面向结构查询语言 |
3. 处理返回的结果集
3.1 单个对象(查询所有) testList1
@Test
public void testList1() {
List<Book> list = session.createQuery("from Book").list();
for (Book book : list) {
System.out.println(book);
}
}
3.2.查数据库表中的某一列 testList2
/**
* 2.查数据库表中的某一列
* sql:在数据库中查询,不区分大小写
* hql:由于查询的是实体类的属性,所以区分大小写
*
*/
@Test
public void testList2() {
List<String> list = session.createQuery("select bookName from Book").list();
for (String bname : list) {
System.out.println(bname);
}
}
3.3 查数据库表中的多列 (如果查询的不是完整的一张表,最好使用map集合) testList3
Object[]
b.bookId, b.bookName
@Test
public void testList3() {
List<Object[]> list = session.createQuery("select bookId,bookName from Book").list();
for (Object[] book : list) {
System.out.println(Arrays.toString(book));
}
}
3.4 查数据库表中的多列 通过hibernate函数Map处理
new Map(b.bookId as bid, b.bookName as bname)
/** 查数据库表中的多列 ( map不能new对象,所以此时的map不是接口 ,是函数 )
* 4. 通过hibernate函数 map处理
*/
@Test
public void testList4() {
List<Map> list = session.createQuery("select new map(bookId,bookName) from Book").list();
for (Map book : list) {
System.out.println(book);
}
}
3.5 通过构造方法进行查询
new Book(b.bookId, b.price)
实体类中`的构造函数
public Book(Integer bookId, String bookName) {
super();
this.bookId = bookId;
this.bookName = bookName;
}
如果没有对应的构造函数则会报错: no appropriate constructor in class: com.zking.five.entity.Book
`
测试
@Test
public void testList5() {
List<Book> list = session.createQuery("select new Book(bookId,bookName) from Book").list();
for (Book book : list) {
System.out.println(book);
}
}
- hql中使用占位符
4.1 ?占位符
从下标0开始计算位置
hibernate5之后不再支持?占位符
4.2 :命名参数
/**
* 二 , hql中使用占位符
* 5版本以后弃用"?"
* 查单个
*/
@Test
public void testList6() {
Query query = session.createQuery("from Book where bookId=:bid");
query.setParameter("bid", 1);
Book book = (Book) query.getSingleResult();
System.out.println(book);
}
/**
* 查多个
*/
@Test
public void testList6_2() {
Query query = session.createQuery("from Book where bookId in (:bookid)");
// List<Integer> bookid=new ArrayList<>();
// bookid.add(1);
// bookid.add(2);
// bookid.add(3);
// query.setParameterList("bookid", bookid);
query.setParameterList("bookid", new Integer[] {1,2,3});
List list = query.list();
for (Object book : list) {
System.out.println(book);
}
}
- 连表查询
@Test
public void testList7() {
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[] objects : list) {
System.out.println(Arrays.toString(objects));
}
}
}
- 聚合函数
sum
avg
max
min
count
举一个例子
@Test
public void testList8() {
String hql="select count(*) from Book";
Long count = (Long) session.createQuery(hql).getSingleResult();
System.out.println(count);
}
- hql分页
int page = 2;// 页码:page
int row = 10;// 每页行数:rows
query.setFirstResult((page - 1) * row);// 设置起始记录下标
query.setMaxResults(row);// 设置返回的最大结果集
/**
* 讲解分页
* 目前book内有7条数据
* 要求一页3条
* 查第二页的数据: limit 起始下标,偏移量
* int page=2 int ofset=3
* select * from t_hibernate_book limit (page-1)*ofset,ofset
*/
@Test
public void testList9() {
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 book : list) {
System.out.println(book);
}
}