前言
今天为大家分享的是hibernate中的一种语言,hql语言!
hql语言
可能会用到的相关实体类代码,可以去这两篇博客中粘贴:
1、hql语言概念
HQL是Hibernate Query Language的缩写,也就是hibernate的查询语言!
2、sql和hql的区别
hql | sql |
---|---|
from关键字后接的是实体类 | from关键字后接的是表名 |
区分大小写,但是关键字不区分大小写 | 不区分大小写 |
支持命名参数 | 不支持命名参数 |
?,从下标0开始计算位置 | ?,从顺序1开始计算位置 |
面向对象的查询语言 | 面向结构的查询语言 |
案例演示
1、代码实现
以下案例是使用junit4单元测试,基于我的上一个项目完成的!
package com.wangqiuping.dao;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import com.wangqiuping.util.SessionFactoryUtils;
public class Test {
Session session=null;
Transaction ts=null;
@Before
public void setUp() throws Exception {
session=SessionFactoryUtils.openSession();
Transaction ts = session.beginTransaction();
}
@After
public void tearDown() throws Exception {
ts.commit();
SessionFactoryUtils.closeSession();
}
@org.junit.Test
public void test() {
//查询返回List
String hql="from Book";
List list = session.createQuery(hql).list();
list.forEach(b->{
System.out.println(b);
});
//单个对象
String hql="from Book b where b.bookId=1";
List list = session.createQuery(hql).list();
list.forEach(b->{
System.out.println(b);
});
//Object[]
String hql="select bookId,bookName,price from Book";
Query query = session.createQuery(hql);
List<Object[]> list=query.list();
list.forEach(b->{
System.out.println(Arrays.toString(b));
});
//Map集合
String hql="select new Map(b.bookId as bookId,b.bookName as bookName,b.price as price) from Book b";
Query query = session.createQuery(hql);
List<Map> list= query.list();
list.forEach(b->{
System.out.println(b);
});
//构造方法
String hql="select new Book(b.bookId as bookId,b.bookName as bookName,b.price as price) from Book b";
Query query = session.createQuery(hql);
List list = query.list();
list.forEach(b->{
System.out.println(b);
});
//命名参数
String hql="from Book b where b.price>:min and b.price<=:max";
Query query = session.createQuery(hql);
query.setParameter("min", 20f);
query.setParameter("max",120f);
List list = query.list();
list.forEach(b->{
System.out.println(b);
});
//聚合函数 sum() count() max() avg() min()
String hql="select sum(price),avg(price),count(price),max(price),min(price) from Book";
Query query = session.createQuery(hql);
List<Object[]> list=query.list();
list.forEach(b->{
System.out.println(Arrays.toString(b));
});
}
}
聚合函数中的这行代码是jdk8新特性的一种遍历方式!
list.forEach(b->{
System.out.println(Arrays.toString(b));
});
当然这一种遍历方式也是可取的
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
如果Book实体类中含有categories的set集合,toString方法中不要给它进行遍历,否则会报错! java.lang.StackOverflowError
2、实现效果
查询返回List
查询单个
Object[ ]
Map集合
这里我为了便于结果的阅读,加上了别名!
构造方法
命名参数
聚合函数
联接查询
这里和上面使用的不是同一个实体类,使用单独粘贴出来!主表和从表之间有字段关联着的,比较适合做联表查询!
package com.wangqiuping.dao;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import com.wangqiuping.util.SessionFactoryUtils;
public class Test {
Session session=null;
Transaction ts=null;
@Before
public void setUp() throws Exception {
session=SessionFactoryUtils.openSession();
Transaction ts=session.beginTransaction();
}
@After
public void tearDown() throws Exception {
ts.commit();
SessionFactoryUtils.closeSession();
}
@org.junit.Test
public void test() {
//联查
String hql = "select t1.orderNo,t2.quantity from Order t1, OrderItem t2 where t1.orderId = t2.order.orderId";
Query query = session.createQuery(hql);
List<Object[]> list=query.list();
list.forEach(b->{
System.out.println(Arrays.toString(b));
});
}
}
联表查询的效果
总结
hql这种语言,适用于一定的场景,但是不适用于所有的应用场景,大部分应用场景中还是使用sql语言会比较多,所以根据学习的需求进行取舍就好,同时也要学会区分hql和sql的不同!