1.什么是HQL?
HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。
2.hql如何处理返回的结果集(5种方式)
/**
* 結果处理情况一:
* 直接利用对象进行数据处理
* jdbc:操作的是数据库表
* hql:操作的是实体类
*
*/
@Test
public void testList1() {
String hql = " from Book";
//Query -->对应的是preparestatement(域定义对象)
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 string : list) {
System.out.println(string);
}
}
/**
* 結果处理情况三:
* 查多个字段,通过Object[]接收
*
*/
@Test
public void testList3() {
String hql="select bookId,bookName from Book";
List<Object[]> list = session.createQuery(hql).list();
for (Object[] string : list) {
System.out.println(Arrays.toString(string));
}
}
/**
* 結果处理情况四:利用hibernate函数进行结果处理
*
*/
@Test
public void testList4() {
String hql="select new map(bookId,bookName) from Book";
List<Map> list = session.createQuery(hql).list();
for (Map string : list) {
System.out.println(string);
}
}
/**
* 結果处理情况五:利用构造方法进行结果处理
* 1.当你给某一个类提供有参构造器,顺便加上无参构造器
* 2.构造方法赋值原理
*/
@Test
public void testList5() {
String hql="select new Book(bookId,bookName) from Book";
List<Book> list = session.createQuery(hql).list();
for (Book string : list) {
System.out.println(string);
}
}
3.hql使用占位符(:XXX)
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);
如果我们想区间查,hql又该怎么写?
String hql = " from Book where price > :min and price < :max ";
如果我们想查询多个,hql怎么写?
String hql = " from Book where bookId in (:bookIds) ";
4:分页
query.setFirstResult((page - 1) * row);// 设置起始记录下标
query.setMaxResults(row);// 设置返回的最大结果集
public void testList9() {
String hql = " from Book where bookName like :bookName ";
int rows =3;
int page =2;
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);
}
}
5.hql和sql区别/异同
HQL | SQL |
类名/属性 | 表名/列名 |
区分大小写,关键字不区分大小写 | 不区分大小写 |
别名 | 别名 |
?,从下标0开始计算位置(hibernate5之后不支持) | ?,从顺序1开始计算位置 |
:命名参数 | 不支持:命名参数 |
面向对象的查询语言 | 面向结构查询语言 |