1. 什么是hql
HQL是Hibernate Query Language的缩写
2. hql和sql区别/异同
package com.xxx.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.xxx.five.entity.Book;
import com.xxx.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);
}
}
}