-
什麼是hql
HQL是Hibernate Query Language的縮寫查全部
-
hql和sql區別/異同
HQL SQL
類名/屬性 表名/列名
區分大小寫,關鍵字不區分大小寫 不區分大小寫
別名 別名
?,從下標0開始計算位置(hibernate5之後不支持) ?,從順序1開始計算位置
:命名參數 不支持:命名參數
面向對象的查詢語言 面向結構查詢語言
代碼:
package com.zking.seven;
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.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.hibernate.query.Query;
import com.ddk.util.Book;
import com.mysql.fabric.xmlrpc.base.Array;
import com.zking.util.HibernateUtils;
/**
- 講解hql的多種查詢方式
- @author Administrator
*/
public class test {
private Session session;
private Transaction transaction;
private Query query;
@Before
public void before() {
session=HibernateUtils.openSession();
transaction=session.beginTransaction();
}
@After
public void after() {
transaction.commit();
session.close();
}
/**
* 結果返回對象
* 查詢所有
* select * from t_hibernate_book;
*/
@Test
public void testList1() {
String hql="from Book";
query = session.createQuery(hql);
List<Book> list=query.list();
for(Book b:list) {
System.out.println(b);
}
}
/**
* 查詢數據庫表中的一列
* 數據庫 :在數據庫中查詢,是不區分大小寫的
* hql:由於你查詢的是實體類的屬性,那麼區分大小寫
*/
@Test
public void testString2() {
String hql="select bookName from Book";
query = session.createQuery(hql);
List<String> list = query.list();
for(String b: list) {
System.out.println(b);
}
}
/**
* Object[]
* 自定義MVC中的EntityBaseDao中
* 數據庫 8列
* 實體類 8個屬性
*
* insert
* Book b
*
* 如果查詢的不是一張完整的表,那麼最後使用map集合
*/
@Test
public void testString3() {
String hql="select bookId,bookName from Book";
query = session.createQuery(hql);
List<Object[]> list = query.list();
for(Object[] b: list) {
System.out.println(Arrays.toString(b));
}
}
/**
* 處理情況4:通過hibernate函數Map去處理
* 函數這個詞來自於數據庫
* 函數不區分大小寫
*/
@Test
public void testmap4() {
String hql="select new map(bookId,bookName) from Book";
query = session.createQuery(hql);
List<Map> list=query.list();
for(Map b : list) {
System.out.println(b);
}
}
/**
*
* 處理情況5:通過構造方法進行查詢
*/
@Test
public void testmap5() {
String hql="select new Book(bookId,bookName) from Book";
query = session.createQuery(hql);
List<Book> list=query.list();
for(Book b : list) {
System.out.println(b);
}
}
/**
* 講解hibernate中的佔用符的問題
* 5版本以後棄用“?”
*
* 使用方法一
*/
@Test
public void testlist6() {
String hql="from Book where bookId =:bookId";
query = session.createQuery(hql);
query.setParameter("bookId", 1);
Book book=(Book) query.getSingleResult();
System.out.println(book);
}
/**
* 使用方法二
*/
@Test
public void testlist61() {
String hql="from Book where bookId in (:bookId)";
query = session.createQuery(hql);
List<Integer> bookId=new ArrayList<>();
bookId.add(1);
bookId.add(2);
bookId.add(3);
query.setParameterList("bookId", bookId);
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
}
/**
* 使用方法三
*/
@Test
public void testlist62() {
String hql="from Book where bookId in (:bookId)";
query = session.createQuery(hql);
query.setParameterList("bookId", new Integer[] {2,4});
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
}
/**
* 連表查詢
*/
@Test
public void testlist7() {
String hql="select o.orderNo,oi.productId from Order o,OrderItem oi where o.orderId = oi.order.orderId";
List<Object[]> list = session.createQuery(hql).list();
for (Object[] object : list) {
System.out.println(Arrays.toString(object));
}
}
/**
* 連表查詢map
*/
@Test
public void testlist78() {
String hql="select new map(o.orderNo,oi.productId) from Order o,OrderItem oi where o.orderId = oi.order.orderId";
List<Map> list = session.createQuery(hql).list();
for (Map object : list) {
System.out.println(object);
}
}
/**
* 聚合函數
*/
@Test
public void testlist8() {
String hql="select count(*) from Book";
long c = (long) session.createQuery(hql).getSingleResult();
System.out.println(c);
}
/**
* 分頁
*/
@Test
public void testlist9() {
String hql="from Book";
Query query = session.createQuery(hql);
int p=2;
int o=2;
query.setFirstResult((p-1)*o);
query.setMaxResults(o);
List<Book> list = query.list();
for (Book b : list) {
System.out.println(b);
}
}
}
3. 處理返回的結果集
3.1 單個對象
select沒有逗號
3.2 Object[]
b.bookId, b.bookName
3.3 Map
new Map(b.bookId as bid, b.bookName as bname)
3.4 new 構造方法(attr1,attr2)
new Book(b.bookId, b.price)
- hql中使用佔位符
4.1 ?佔位符
從下標0開始計算位置
hibernate5之後不再支持?佔位符
4.2 :命名參數
-
連接查詢
-
聚合函數
sum
avg
max
min
count -
hql分頁
int page = 2;// 頁碼:page
int row = 10;// 每頁行數:rows
query.setFirstResult((page - 1) * row);// 設置起始記錄下標
query.setMaxResults(row);// 設置返回的最大結果集