Hql学习①
一、 什么是hql
1、含义:HQL是Hibernate Query Language的缩写
2、hql和sql区别/异同
HQL【 面向对象的查询语言 】 | SQL【 面向结构查询语言】 |
---|---|
类名/属性 | 表名/列名 |
区分大小写,关键字不区分大小写 | 不区分大小写 |
– | – |
别名 | 别名 |
?,从下标0开始计算位置(hibernate5之后不支持) | ?,从顺序1开始计算位置 |
– | – |
:命名参数 | 不支持:命名参数 |
二、 处理返回的结果集
1、单个对象
select没有逗号
/**
* 结果处理情况一:
* 直接利用对象进行数据接受
*/
@Test
public void testList1() {
String hql = "from Book";
Query query = session.createQuery(hql);
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
/**
* 结果处理情况五:
* 查一列
* jdbc:查的是表中某列 列名不区分大小写
* hql:查的是实体类的某一属性 严格区分大小写 关键字不区分大小写
*
*/
@Test
public void testList2() {
String hql = "select bookName from Book";
List<String> list = session.createQuery(hql).list();
for (String bname : list) {
System.out.println(bname);
}
}
2、 Object[]
/**
* 结果处理情况二:
* Object[]
* mvc——>EntityBaseDao.insert(sql,keys)
*/
@Test
public void testList3() {
String hql = "select bookId,bookName from Book";
List<Object[]> list = session.createQuery(hql).list();
for (Object[] book : list) {
System.out.println(Arrays.toString(book));
}
}
3、Map
new Map(b.bookId as bid, b.bookName as bname)
/**
* 结果处理情况三:
* 利用hibernate内置的函数进行结果处理
*/
@Test
public void testList4() {
String hql = "select new map(bookId,bookName) from Book";
List<Map> list = session.createQuery(hql).list();
for (Map book : list) {
System.out.println(book);
}
}
4、 new 构造方法(attr1,attr2)
new Book(b.bookId, b.price)
/**
* 结果处理情况四:
* 利用构造方法进行结果处理
* 1、当你给某一个类提供有参构造器,顺便加上无参构造器
* 2、构造方法赋值的原理(完善mvc框架的通用CRUD)
*
*/
@Test
public void testList5() {
String hql = "select new Book(bookId,bookName) from Book";
List<Book> list = session.createQuery(hql).list();
for (Book book : list) {
System.out.println(book);
}
}
三、hql中使用占位符
1、?占位符
从下标0开始计算位置
hibernate5之后不再支持?占位符
2、 :命名参数
/**
* hql中使用占位符
*/
@Test
public void testList6() {
// String hql = "from Book where bookId = :bookId";
// Query query = session.createQuery(hql);
// query.setParameter("bookId", 2);
// Book book = (Book) query.getSingleResult();
// System.out.println(book);
// String hql = "from Book where price > :min and price < :max";
// Query query = session.createQuery(hql);
// query.setParameter("min", 120f);
// query.setParameter("max", 200f);
// List<Book> list = query.list();
// for (Book book : list) {
// System.out.println(book);
// }
String hql = "from Book where bookId in (:bookIds)";
Query query = session.createQuery(hql);
// query.setParameterList("bookIds", new Integer[] {2,3,4});
List<Integer> params = new ArrayList<Integer>();
params.add(1);
params.add(2);
params.add(3);
query.setParameterList("bookIds", params);
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
四、 连接查询 Object[]
/**
* 联表查询:Object[]
*/
@Test
public void testList7() {
// String hql = "select o.OrderNo,oi.quantity from Order o,OrderItem oi where o.OrderId = oi.order.OrderId";
String hql = "select o.OrderNo,oi.quantity from Order o,OrderItem oi where o = oi.order";
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";
Object result = session.createQuery(hql).getSingleResult();
System.out.println(result);
}
六、 hql分页
/**
*hibernate中的分页
*query.setFirstResult((page - 1) * row);// 设置起始记录下标
* query.setMaxResults(row);// 设置返回的最大结果集
*/
@Test
public void testList9() {
String hql = "from Book where bookName like :bookName";
int rows = 2;
int page = 1;
Query query = session.createQuery(hql);
query.setParameter("bookName", "%霸道%");
query.setFirstResult((page-1)*rows);
query.setMaxResults(rows);
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}