文章目录
Hql
什么是hql?
Hibernate查询语言 hibernate query language,它是hibernate的查询语句。
hql和sql区别/异同
竟然都是查询语句那么我们来对比区别一下,注:hibernate5之后不再支持?占位符。
HQL | SQL |
---|---|
类名,属性;关键字 | 表名 |
类名,属性名都区分大小写,但是关键字不区分大小写 | 都不区分大小写 |
别名 | 别名 |
?,从下标0开始计算位置 | ?,从顺序1开始计算 |
:命名参数 | 不支持:命名参数 |
面向对象的查询语言 | 面向结构查询语言 |
案例
基于此表我们创建对应实体类和Juint配合案例来理解一下。
Juint类
我们可在类中逐个添加方法来进行案例演示。
public class HqlTest {
//声明
Transaction ts=null;
Session session=null;
@Before
public void setUp() throws Exception {
//在初始化方法里面实例化
session = SessionFactoryUtils.openSession();
ts = session.beginTransaction();
}
@After
public void after() throws Exception {
//在方法执行后提交事物和session
ts.commit();
SessionFactoryUtils.closeSession();
}
}
1.查看全部的语句
//查全部
@Test
public void test1() {
//查全部
String hql=" from Book";
Query query = session.createQuery(hql);
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
2.查询单个
//查单个
@Test
public void test2() {
//查全部
String hql=" from Book where book_name=? ";
Query query = session.createQuery(hql);
query.setString(0, "西游记");
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
3.查询单个字段
//查单个字段
@Test
public void test3() {
//查全部
//String hql=" select bookName from Book where book_name=?";
String hql=" select bookName from Book where book_name=:uname";
Query query = session.createQuery(hql);
// query.setString(0, "西游记");
query.setString("uname", "西游记");
List<String> list = query.list();
for (String s : list) {
System.out.println(s);
}
}
4.查询多个字段
这里用于你想需要查询某些字段的值但是你不知道它的类型。
//返回object[]
@Test
public void test4() {
String hql=" select bookName,bookId from Book where book_name=:uname";
Query query = session.createQuery(hql);
query.setString("uname", "西游记");
List<Object[]> list = query.list();
for (Object[] s : list) {
System.out.println(Arrays.toString(s));
}
}
5.map查询(必须加as关键字,不然报错)
相比上面一种的话这里能够键值对应,能够直观的理解对应的键值。
//返回map(map是hibernate中的一个内置函数)
@Test
public void test5() {
String hql=" select new Map(bookName as bookName ,bookId as bookId) from Book where book_name=:uname";
Query query = session.createQuery(hql);
query.setString("uname", "西游记");
List<Map> list = query.list();
for (Map m : list) {
System.out.println(m);
}
}
6.构造方法
new 构造方法(attr1,attr2) 只有返回的结果属性有值,其他都是空的,注意:你实体类里面必须要有对应的构造函数。
//构造方法
@Test
public void test6() {
String hql=" select new Book(bookId,bookName) from Book where book_name=:uname";
Query query = session.createQuery(hql);
query.setString("uname", "西游记");
List<Book> list = query.list();
for (Book b : list) {
System.out.println(b);
}
}
7.连接查询
//连表
@Test
public void test7() {
String hql=" select o.orderNo,oi.quantity from Order o,OrderItem oi where o.orderId=oid";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] b : list) {
System.out.println(Arrays.toString(b));
}
}
8.聚合函数
sum,avg,max, min, count
//聚合函数
@Test
public void test8() {
String hql=" select o.orderNo,sum(oi.quantity) from Order o,OrderItem oi where o.orderId=oid group by o.orderNo ";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] b : list) {
System.out.println(Arrays.toString(b));
}
}
9.hql分页
//假分页
@Test
public void test9() {
int page=1;
int rows=2;
String hql=" from Book where 1=1";
Query query = session.createQuery(hql);
//启始记录的下标
query.setFirstResult((page-1)*rows);
//返回最大结果集
query.setMaxResults(rows);
List<Book> list = query.list();
for ( Book b : list) {
System.out.println(b);
}
}