hql学习

1. 什么是hql
HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。

2. hql和sql区别/异同

HQLSQL
类名/属性表名/列名
区分大小写,关键字不区分大小写不区分大小写
别名别名
:命名参数不支持:命名参数
?,从下标0开始计算位置(hibernate5之后不支持)?,从顺序1开始计算位置
面向对象的查询语言面向结构查询语言

3. 处理返回的结果集
3.1 单个对象(查询所有) testList1

@Test
public void testList1() {
  List<Book> list = session.createQuery("from Book").list();
  for (Book book : list) {
	System.out.println(book);
}
}

3.2.查数据库表中的某一列 testList2


/**
* 2.查数据库表中的某一列 
* sql:在数据库中查询,不区分大小写
* hql:由于查询的是实体类的属性,所以区分大小写
* 
*/

@Test
public void testList2() {
  List<String> list = session.createQuery("select bookName from Book").list();
   for (String bname : list) {
   	System.out.println(bname);
   }
}


3.3 查数据库表中的多列 (如果查询的不是完整的一张表,最好使用map集合) testList3
Object[]
b.bookId, b.bookName


@Test
public void testList3() {
     List<Object[]> list = session.createQuery("select bookId,bookName from Book").list();
	for (Object[] book : list) {
		System.out.println(Arrays.toString(book));
	}
}

3.4 查数据库表中的多列 通过hibernate函数Map处理
new Map(b.bookId as bid, b.bookName as bname)

/**  查数据库表中的多列 ( map不能new对象,所以此时的map不是接口 ,是函数 )
 * 4. 通过hibernate函数 map处理 
 */
@Test
public void testList4() {
 List<Map> list = session.createQuery("select new map(bookId,bookName) from Book").list();
	for (Map book : list) {
		System.out.println(book);
	}

}

3.5 通过构造方法进行查询
new Book(b.bookId, b.price)
实体类中`的构造函数

 public Book(Integer bookId, String bookName) {
	super();
	this.bookId = bookId;
	this.bookName = bookName;
}

如果没有对应的构造函数则会报错: no appropriate constructor in class: com.zking.five.entity.Book

`
测试

@Test 
public void testList5() {
List<Book> list = session.createQuery("select new Book(bookId,bookName) from Book").list();
	for (Book book : list) {
		System.out.println(book);
	}

}
  1. hql中使用占位符
    4.1 ?占位符
    从下标0开始计算位置
    hibernate5之后不再支持?占位符

4.2 :命名参数

/**
 * 二  , hql中使用占位符
 *  5版本以后弃用"?"
 *  查单个
 */
@Test 
public void testList6() {
	Query query = session.createQuery("from Book where bookId=:bid");
	query.setParameter("bid", 1);
	Book book = (Book) query.getSingleResult();
    System.out.println(book);
}

/**
 * 查多个
 */
@Test 
public void testList6_2() {
	Query query = session.createQuery("from Book where bookId in (:bookid)");
//	 List<Integer> bookid=new ArrayList<>();
//	 bookid.add(1);
//	 bookid.add(2);
//	 bookid.add(3);
//	 query.setParameterList("bookid", bookid);
	
	 query.setParameterList("bookid", new Integer[] {1,2,3});
   
	 List list = query.list();
     for (Object book : list) {
		System.out.println(book);
	}
}

  1. 连表查询
@Test 
public void testList7() {
	String hql="select o.orderNo,oi.productId from Order o,OrderItem oi where o.orderId=oi.order.orderId";
    Query query = session.createQuery(hql);
   List<Object[]> list = query.list();
   for (Object[] objects : list) {
		System.out.println(Arrays.toString(objects));
	}
 
	
}

}

  1. 聚合函数
    sum
    avg
    max
    min
    count
    举一个例子
@Test 
public void testList8() {
	String hql="select count(*) from Book";
	Long count =  (Long) session.createQuery(hql).getSingleResult();
    System.out.println(count);
}

  1. hql分页
    int page = 2;// 页码:page
    int row = 10;// 每页行数:rows
    query.setFirstResult((page - 1) * row);// 设置起始记录下标
    query.setMaxResults(row);// 设置返回的最大结果集
/**
 * 讲解分页
 *  目前book内有7条数据
 *  要求一页3条
 *  查第二页的数据: limit 起始下标,偏移量
 *              int page=2  int ofset=3
 *  select * from t_hibernate_book limit (page-1)*ofset,ofset           
 */  
@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();
     for (Book book : list) {
		System.out.println(book);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值