-
什么是hql
HQL是Hibernate Query Language的缩写查全部
-
hql和sql区别/异同
HQL SQL
类名/属性 表名/列名
区分大小写,关键字不区分大小写 不区分大小写
别名 别名
?,从下标0开始计算位置(hibernate5之后不支持) ?,从顺序1开始计算位置
:命名参数 不支持:命名参数
面向对象的查询语言 面向结构查询语言
代码:
package com.zking.seven;
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.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.hibernate.query.Query;
import com.ddk.util.Book;
import com.mysql.fabric.xmlrpc.base.Array;
import com.zking.util.HibernateUtils;
/**
- 讲解hql的多种查询方式
- @author Administrator
*/
public class test {
private Session session;
private Transaction transaction;
private Query query;
@Before
public void before() {
session=HibernateUtils.openSession();
transaction=session.beginTransaction();
}
@After
public void after() {
transaction.commit();
session.close();
}
/**
* 结果返回对象
* 查询所有
* select * from t_hibernate_book;
*/
@Test
public void testList1() {
String hql="from Book";
query = session.createQuery(hql);
List<Book> list=query.list();
for(Book b:list) {
System.out.println(b);
}
}
/**
* 查询数据库表中的一列
* 数据库 :在数据库中查询,是不区分大小写的
* hql:由于你查询的是实体类的属性,那么区分大小写
*/
@Test
public void testString2() {
String hql="select bookName from Book";
query = session.createQuery(hql);
List<String> list = query.list();
for(String b: list) {
System.out.println(b);
}
}
/**
* Object[]
* 自定义MVC中的EntityBaseDao中
* 数据库 8列
* 实体类 8个属性
*
* insert
* Book b
*
* 如果查询的不是一张完整的表,那么最后使用map集合
*/
@Test
public void testString3() {
String hql="select bookId,bookName from Book";
query = session.createQuery(hql);
List<Object[]> list = query.list();
for(Object[] b: list) {
System.out.println(Arrays.toString(b));
}
}
/**
* 处理情况4:通过hibernate函数Map去处理
* 函数这个词来自于数据库
* 函数不区分大小写
*/
@Test
public void testmap4() {
String hql="select new map(bookId,bookName) from Book";
query = session.createQuery(hql);
List<Map> list=query.list();
for(Map b : list) {
System.out.println(b);
}
}
/**
*
* 处理情况5:通过构造方法进行查询
*/
@Test
public void testmap5() {
String hql="select new Book(bookId,bookName) from Book";
query = session.createQuery(hql);
List<Book> list=query.list();
for(Book b : list) {
System.out.println(b);
}
}
/**
* 讲解hibernate中的占用符的问题
* 5版本以后弃用“?”
*
* 使用方法一
*/
@Test
public void testlist6() {
String hql="from Book where bookId =:bookId";
query = session.createQuery(hql);
query.setParameter("bookId", 1);
Book book=(Book) query.getSingleResult();
System.out.println(book);
}
/**
* 使用方法二
*/
@Test
public void testlist61() {
String hql="from Book where bookId in (:bookId)";
query = session.createQuery(hql);
List<Integer> bookId=new ArrayList<>();
bookId.add(1);
bookId.add(2);
bookId.add(3);
query.setParameterList("bookId", bookId);
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
}
/**
* 使用方法三
*/
@Test
public void testlist62() {
String hql="from Book where bookId in (:bookId)";
query = session.createQuery(hql);
query.setParameterList("bookId", new Integer[] {2,4});
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
}
/**
* 连表查询
*/
@Test
public void testlist7() {
String hql="select o.orderNo,oi.productId from Order o,OrderItem oi where o.orderId = oi.order.orderId";
List<Object[]> list = session.createQuery(hql).list();
for (Object[] object : list) {
System.out.println(Arrays.toString(object));
}
}
/**
* 连表查询map
*/
@Test
public void testlist78() {
String hql="select new map(o.orderNo,oi.productId) from Order o,OrderItem oi where o.orderId = oi.order.orderId";
List<Map> list = session.createQuery(hql).list();
for (Map object : list) {
System.out.println(object);
}
}
/**
* 聚合函数
*/
@Test
public void testlist8() {
String hql="select count(*) from Book";
long c = (long) session.createQuery(hql).getSingleResult();
System.out.println(c);
}
/**
* 分页
*/
@Test
public void testlist9() {
String hql="from Book";
Query query = session.createQuery(hql);
int p=2;
int o=2;
query.setFirstResult((p-1)*o);
query.setMaxResults(o);
List<Book> list = query.list();
for (Book b : list) {
System.out.println(b);
}
}
}
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)
- hql中使用占位符
4.1 ?占位符
从下标0开始计算位置
hibernate5之后不再支持?占位符
4.2 :命名参数
-
连接查询
-
聚合函数
sum
avg
max
min
count -
hql分页
int page = 2;// 页码:page
int row = 10;// 每页行数:rows
query.setFirstResult((page - 1) * row);// 设置起始记录下标
query.setMaxResults(row);// 设置返回的最大结果集