1. 什么是hql
HQL是Hibernate Query Language的缩写
查全部
2. hql和sql区别/异同
HQL SQL
类名/属性 表名/列名
区分大小写,关键字不区分大小写 不区分大小写
别名 别名
?,从下标0开始计算位置(hibernate5之后不支持) ?,从顺序1开始计算位置
:命名参数 不支持:命名参数
面向对象的查询语言 面向结构查询语言
注1:QuerySyntaxException:book is not mapped
3. 处理返回的结果集
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)
4. hql中使用占位符
4.1 ?占位符
从下标0开始计算位置
hibernate5之后不再支持?占位符
4.2 :命名参数
5. 连接查询
6. 聚合函数
sum
avg
max
min
count
7. hql分页
int page = 2;// 页码:page
int row = 10;// 每页行数:rows
query.setFirstResult((page - 1) * row);// 设置起始记录下标
query.setMaxResults(row);// 设置返回的最大结果集
----------------------------------------------------------------------------------------------------------------------
一些测试的实例
package com.company.seven.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.mysql.cj.x.protobuf.MysqlxDatatypes.Array;
import com.company.five.entity.Book;
import com.company.two.util.SessionFactoryUtils;
public class HqlTest {
private Session session;
private Transaction transaction;
// 测试方法前回调用的方法
@Before
public void before() {
session = SessionFactoryUtils.getSession();
transaction = session.beginTransaction();
}
/**
* 结果处理情况一:Book
* 直接利用对象进行数据接收
* jdbc:操作数据库的表
*
* hql:操作实体类
*
*/
@Test
public void testList1() {
// Query 相当于 prepareStateent
Query query = session.createQuery("from Book");
List
for (Book book : list) {
System.out.println(book);
}
}
/**
* 情况二:String
* 查一列
* jdbc:查的是表中某列,列名不区分大小写
* hql:查的是实体类的某一属性,严格区分大小写
*/
@Test
public void testList2() {
String hql = "select bookName from Book";
List
for (String string : list) {
System.out.println(string);
}
}
/**
* 情况三:Object[]
* 查多列
*
*/
@Test
public void testList3() {
String hql = "select bookId,bookName from Book";
List
// 执行完测试方法会调用
@After
public void after() {
transaction.commit();
session.close();
}
}