hibernate:hql

1. 什么是hql

HQL是Hibernate Query Language的缩写

2. hql和sql区别/异同

在这里插入图片描述

package com.zking.seven;

import static org.junit.Assert.*;

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.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import com.zking.five.entity.Book;
import com.zking.two.util.SessionFactoryUtils;

public class HqlTest {
	private Session session;
	private Transaction transaction;
	
	
	@Before
	public void before() {
		session = SessionFactoryUtils.getSession();
		transaction = session.beginTransaction();
		
	}
	@After
	public void after() {
		transaction.commit();
		session.close();
	}
	
	/**
	 * 结果处理情况1:
	 * 直接利用对象进行数据接收
	 * jdbc:操作的数据库表
	 * select * from t_hibernate_book
	 * list<Book> list=this.BookDao.executeQuery(sql,pageBean,book.class)
	 * hql:操作的实体类
	 * 
	 * select * from t_hibernate_book
	 * resultSet	rs
	 * Book [bookId=1, bookName=西游记, price=50.0]
	   Book [bookId=2, bookName=红楼梦, price=50.0]
	   Book [bookId=3, bookName=水浒, price=50.0]
	   Book [bookId=4, bookName=三国演义, price=50.0]
	   Book [bookId=5, bookName=不死不灭, price=40.0]
	   Class clz=Book.class;
	   while(rs.next){
	   		Book b=clz.newInstance();//默认调无参构造器
	   		--->construct c=clz.getdecarldconstruct();
	   		c.newInstance();
	   		Field[] Fields=clz.getDecareldFields();//获取类所有的属性
	   		for(Field f:Fields){
	   			f.set(b,rs.getObject(1));
	   		}
	   			list.add(b);
	 */
	@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);
		}
	}
	
	/**
	 * 结果处理情况2:String
	 * 查一列一定要加select
	 * 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);
		}
	}
	
	/**
	 * 结果处理情况3:Object[]
	 * Class	
	 * Book
	 * mvc-->EntityBaseDao的insert方法(insert(sql,keys,Book book))
	 * 表里有8个字段
	 * 建实体类	实体类里有8个属性
	 * 
	 * Book book传值	6个
	 * keys new String[]{"","","","","",""}<意味着有两个属性没有赋值,是空的>
	 * 报错:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.zking.five.entity.Book
	 * 解决办法:通过map集合去做
	 * 
	 */
	@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));
		}
	}
	
	
	/**
	 * 结果处理情况4:利用hibernate内置函数进行结果处理
	 * 接口不可以new对象		hibernate的类严格区别大小写
	 * 所以这里的map不是接口也不是实现类是内置函数
	 */
	@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);
		}
	}
	
	
	/**
	 * 结果处理情况5:利用构造方法进行结果处理
	 * new一个对象,里面放你需要的属性,然后去类的提供构造方法
	 * 
	 * 1、当你给某一个类提供有参构造器,顺便加上一个无参构造器
	 * 2、构造方法赋值的原理:
	 * 查了id,name
	 * 1	西游记	
	   2	红楼梦	
	   3	水浒	
	   4	三国演义	
	   5	不死不灭	
		放在resultSet里
		查的book这个实体类的话,可以拿到Class clz=Book.class//拿到Class类的一个实例
		construt c=clz.getDecarldconstrut(参数)//拿到有参的构造器
		c.newInstance(参数)
		获取到有参构造器中参数
			Field[] Fields=clz.getDecareldFields();//获取类所有的属性
	   		for(Field f:Fields){
	   			f.set(b,rs.getObject(1));
	   		}
	   		list.add(c.newInstance(参数));
	 */
	@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中使用占位符
	 * jdbc:select *from t_hibernate_book where book_id=?
	 * hql:form Book where bookId =?/:bookId(?不建议使用,hibernate5之后不在支持?的占位符)
	 */
	@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", 44f);
//		query.setParameter("max", 54f);
//		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,4,5});//第一种
		List<Integer> params=new ArrayList<Integer>();//第二种
		params.add(1);
		params.add(2);
		query.setParameterList("bookIds", params);
		List<Book> list=query.list();
		for (Book book : list) {
			System.out.println(book);
		}
	}
	
	
	/**
	 * 连表查询
	 * jdbc:select * from t_hibernate_order o,t_hibernate_order_item oi where o.orderId=oi.oid
	 * hibernate:select * from Order o,OrderItem oi where o.orderId=oi.order.orderId
	 */
	@Test
	public void testList7() {
//		String hql="select o.OrderNo,oi.productId from Order o,OrderItem oi where o.orderId=oi.order.orderId";
		String hql="select o.OrderNo,oi.productId 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));
		}
	}
	
	
	/**
	 * 聚合函数的讲解
	 */
	@Test
	public void testList8() {
		String hql="select count(*) from Book";
		Query query = session.createQuery(hql);
		Object result = query.getSingleResult();
		System.out.println(result);
	}
	
	
	/**
	 * 讲解hiber中的分页
	 * int rows=3;
	 * int page=2;
	 * 	jdbc:sql=select * from t_hibernate_book where book_name like '%?%';
	 * sql+="limit ?,?"
	 * 1、起始位置(2-1)*3
	 * 2、偏移量	3
	 */
	@Test
	public void testList9() {
		String hql="from Book where bookName like :bookName";
		int rows=3;
		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);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/x_b_z123/article/details/83512557