目录
简介HqlTest功能演示用HQL实现通用方法调用BaseDao方法来执行自己的方法测试方法
简介
什么是HQL? HQL是Hibernate Query Language的缩写是一种查询语言。hql和sql区别/异同 | HQL | SQL | | 类名/属性 |表名/列名| | 区分大小写,关键字不区分大小写 | 不区分大小写| | 别名 | 别名| | ?,从下标0开始计算位置(hibernate5之后不支持)|?,从顺序1开始计算位置| |:命名参数 |不支持:命名参数| |面向对象的查询语言 | 面向对象的查询语言 |处理返回的结果集
返回对象(多个)查询所有返回单个列段,用字符串就可以接受,返回String类型 只查询书的名称查两个列段及以上,默认返回的是Object【】,查询两个列的数据注意map是函数,所以不区分大小写,返回的是map集合,用函数来查询多个列段。查两个列段及以上,也可返回对象,前提是有对应的构造函数HQL语句支持占位符,用变量名代替(?占位符 从下标0开始计算位置)HQL支持连接查询 (select o.orderNo,oi.quantity from Order o,OrderItem oi where o = oi.order)HQL支持聚合函数(sum avg max min count)HQL分页 同样的可以自动根据方言生成分页语句 setFirstResult:设置起始下标 setMaxResults:设置偏移量
HqlTest功能演示
package com
.hibernate
.test
;
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
.Test
;
import com
.hibernate
.enetiy
.Book
;
import com
.hibernate
.util
.SessionFactoryUtils
;
public class HqlTest {
private Session session
;
private Transaction transaction
;
@Before
public void before() {
session
= SessionFactoryUtils
.openSession();
transaction
= session
.beginTransaction();
}
@After
public void after() {
transaction
.commit();
session
.close();
}
@Test
public void testList1() {
Query query
= session
.createQuery("from Book");
List
<Book> list
= query
.list();
for (Book b
: list
) {
System
.out
.println(b
);
}
}
@Test
public void testList2() {
Query query
= session
.createQuery("select b.bookName as ss from Book b");
List
<String> list
= query
.list();
for (String b
: list
) {
System
.out
.println(b
);
}
}
@Test
public void testList3() {
Query query
= session
.createQuery("select b.bookId,b.bookName as ss from Book b");
List
<Object
[]> list
= query
.list();
for (Object
[] b
: list
) {
System
.out
.println(Arrays
.toString(b
));
}
}
@Test
public void testList4() {
Query query
= session
.createQuery("select new mAp(b.bookId,b.bookName) from Book b");
List
<Map> list
= query
.list();
for (Map b
: list
) {
System
.out
.println(b
);
}
}
@Test
public void testList5() {
Query query
= session
.createQuery("select new Book(b.bookId,b.bookName) from Book b");
List
<Book> list
= query
.list();
for (Book b
: list
) {
System
.out
.println(b
);
}
}
@Test
public void testList6() {
Query query
= session
.createQuery("from Book where bookId in (:bookIds)");
query
.setParameterList("bookIds", new Integer[] {1,2,4});
List
<Book> list
= query
.list();
for (Book b
: list
) {
System
.out
.println(b
);
}
}
@Test
public void testList7() {
Query query
= session
.createQuery("select o.orderNo,oi.quantity from Order o,OrderItem oi where o = oi.order");
List
<Object
[]> list
= query
.list();
for (Object
[] b
: list
) {
System
.out
.println(Arrays
.toString(b
));
}
}
@Test
public void testList8() {
Query query
= session
.createQuery("select count(*) from Book");
Long singleResult
= (Long
) query
.getSingleResult();
System
.out
.println(singleResult
);
}
@Test
public void testList9() {
Query query
= session
.createQuery("from Book");
query
.setFirstResult(1);
query
.setMaxResults(3);
List
<Book> list
= query
.list();
for (Book b
: list
) {
System
.out
.println(b
);
}
}
}
用HQL实现通用方法
BaseDao
package com
.hibernate
.util
;
import java
.util
.Collection
;
import java
.util
.List
;
import java
.util
.Map
;
import java
.util
.Map
.Entry
;
import java
.util
.Set
;
import org
.hibernate
.Session
;
import org
.hibernate
.query
.Query
;
public class BaseDao {
private void setParam(Map
<String,Object> map
, Query query
) {
if(map
!=null
&& map
.size() >0) {
Object value
=null
;
Set
<Entry
<String, Object>> entrySet
=map
.entrySet();
for (Entry
<String, Object> entry
: entrySet
) {
value
=entry
.getValue();
if(value
instanceof Object[]) {
query
.setParameterList(entry
.getKey(),(Object
[])value
);
}else if(value
instanceof Collection) {
query
.setParameterList(entry
.getKey(), (Collection
)value
);
}else {
query
.setParameter(entry
.getKey(),value
);
}
}
}
}
public String
getCountHql(String hql
) {
int index
= hql
.toUpperCase().indexOf("FROM");
return "select count(*) "+hql
.substring(index
);
}
public List
executeQuery(Session session
,Map
<String, Object> map
,String hql
,PageBean pageBean
) {
List list
=null
;
if(pageBean
!=null
&& pageBean
.isPagination()) {
String countHql
= getCountHql(hql
);
Query countQuery
= session
.createQuery(countHql
);
this.setParam(map
, countQuery
);
pageBean
.setTotal(countQuery
.getSingleResult().toString());
Query query
= session
.createQuery(hql
);
this.setParam(map
, query
);
query
.setFirstResult(pageBean
.getStartIndex());
query
.setMaxResults(pageBean
.getRows());
list
= query
.list();
}else {
Query query
= session
.createQuery(hql
);
this.setParam(map
, query
);
list
=query
.list();
}
return list
;
}
}
调用BaseDao方法来执行自己的方法
BookDao
public class BookDao extends BaseDao{
public List
<Book> list1(Book book
,PageBean pageBean
) {
Session session
= SessionFactoryUtils
.openSession();
Transaction transaction
= session
.beginTransaction();
String bookName
=book
.getBookName();
String hql
="from Book where 1=1";
if(StringUtils
.isNotBlank(bookName
)) {
hql
+="and bookName like : bookName ";
}
Query query
= session
.createQuery(hql
);
if(StringUtils
.isNotBlank(bookName
)) {
query
.setParameter("bookName", bookName
);
}
if(pageBean
!=null
&& pageBean
.isPagination()) {
query
.setFirstResult(pageBean
.getStartIndex());
query
.setMaxResults(pageBean
.getRows());
}
List
<Book> list
=query
.list();
transaction
.commit();
session
.close();
return list
;
}
public List
<Book> list12(Book book
,PageBean pageBean
) {
Session session
= SessionFactoryUtils
.openSession();
Transaction transaction
= session
.beginTransaction();
String bookName
=book
.getBookName();
Map
<String, Object> map
=new HashMap<>();
String hql
="from Book where 1=1";
if(StringUtils
.isNotBlank(bookName
)) {
hql
+="and bookName like : bookName ";
map
.put("bookName", bookName
);
}
List
<Book> list
=super.executeQuery(session
, map
, hql
, pageBean
);
transaction
.commit();
session
.close();
return list
;
}
}
测试方法
BookDaoTest
public class BookDaoTest {
private BookDao bookDao
= new BookDao();
@Test
public void testList1() {
Book book
=new Book();
PageBean pageBean
=new PageBean();
List
<Book> list
=this.bookDao
.list1(book
, pageBean
);
for (Book b
: list
) {
System
.out
.println(b
);
}
}
@Test
public void testList2() {
Book book
=new Book();
PageBean pageBean
=new PageBean();
pageBean
.setPage(2);
pageBean
.setRows(3);
List
<Book> list
=this.bookDao
.list12(book
, pageBean
);
for (Book b
: list
) {
System
.out
.println(b
);
}
}
}