hql和sql区别/异同
HQL ————————————SQL
类名/属性 ————————— 表名/列名
区分大小写,关键字不区分大小写———— 不区分大小写
别名————————————————别名
?,从下标0开始计算位置(hibernate5之后不支持) ?,从顺序1开始计算位置
:命名参数———————————— 不支持:命名参数
面向对象的查询语言—————————— 面向结构查询语言
演示:
/**
* 一、结果 返回对象
* 查询所有
*/
@Test
public void testList1() {
String hql = "from Book";
Query query = session.createQuery(hql);
List<Book> list = query.list();
list.forEach(System.out::println);
}
/**
* 二、查询数据库表中的一列
* sql:在数据库表中查询,不区分大小写
* hql:由于查询的是实体类的属性,区分大小写
*/
@Test
public void testList2() {
String hql = "select bookName from Book";
List<String> list = session.createQuery(hql).list();
list.forEach(System.out::println);
}
/**
* Object[]
* 三、如果不是查询一张表 最好使用map
*/
@Test
public void testList3() {
String hql = "select bookId,bookName from Book";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
list.forEach(System.out::println);
}
/**
* 四、通过hibernate函数Map去处理
* 函数不区分大小写
*/
@Test
public void testList4() {
String hql = "select new map(bookId,bookName) from Book";
Query query = session.createQuery(hql);
List<Map> list = query.list();
list.forEach(System.out::println);
}
/**
* 五、通过构造方法查询
*
* 注意:新建了一个有参的构造方法,默认的无参构造方法就没有了
* 需要补一个无参的构造方法
*/
@Test
public void testList5() {
String hql = "select new Book(bookId,bookName) from Book";
Query query = session.createQuery(hql);
List<Book> list = query.list();
list.forEach(System.out::println);
}
/**
* 六、hql占位符
* 5版本之后不用"?"
*/
@Test
public void testList6() {
String hql = "from Book where bookId = :bookId";
Query query = session.createQuery(hql);
query.setParameter("bookId", 1);
Book book = (Book) query.getSingleResult();
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";
List<Object[]> list = session.createQuery(hql).list();
list.forEach(System.out::println);
}
/**
* 聚合函数
*/
@Test
public void testList8() {
String hql ="select count(*) from Book ";
Long count = (Long) session.createQuery(hql).getSingleResult();
System.out.println("count:"+count);
}
/**
* 分页
*/
@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();
list.forEach(System.out::println);
}