hql語言的使用及與sql語言的區別
1. 什麼是hql
HQL是Hibernate Query Language的縮寫
查全部
2. hql和sql區別/異同
HQL SQL
類名/屬性 表名/列名
區分大小寫,關鍵字不區分大小寫 不區分大小寫
別名 別名
?,從下標0開始計算位置(hibernate5之後不支援) ?,從順序1開始計算位置
:命名引數 不支援:命名引數
面向物件的查詢語言 面向結構查詢語言
注1:QuerySyntaxException:book is not mapped
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)
4. hql中使用佔位符
4.1 ?佔位符
從下標0開始計算位置
hibernate5之後不再支援?佔位符
4.2 :命名引數
5. 連線查詢
6. 聚合函式
sum
avg
max
min
count
7. hql分頁
int page = 2;// 頁碼:page
int row = 10;// 每頁行數:rows
query.setFirstResult((page - 1) * row);// 設定起始記錄下標
query.setMaxResults(row);// 設定返回的最大結果集
----------------------------------------------------------------------------------------------------------------------
一些測試的例項
package com.zking.seven.test;
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.Test;
import com.mysql.cj.x.protobuf.MysqlxDatatypes.Array;
import com.zking.five.entity.Book;
import com.zking.two.util.SessionFactoryUtils;
public class HqlTest {
private Session session;
private Transaction transaction;
// 測試方法前回呼叫的方法
@Before
public void before() {
session = SessionFactoryUtils.getSession();
transaction = session.beginTransaction();
}
/**
* 結果處理情況一:Book
* 直接利用物件進行資料接收
* jdbc:操作資料庫的表
*
* hql:操作實體類
*
*/
@Test
public void testList1() {
// Query 相當於 prepareStateent
Query query = session.createQuery("from Book");
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
/**
* 情況二:String
* 查一列
* jdbc:查的是表中某列,列名不區分大小寫
* hql:查的是實體類的某一屬性,嚴格區分大小寫
*/
@Test
public void testList2() {
String hql = "select bookName from Book";
List<String> list = session.createQuery(hql).list();
for (String string : list) {
System.out.println(string);
}
}
/**
* 情況三:Object[]
* 查多列
*
*/
@Test
public void testList3() {
String hql = "select bookId,bookName from Book";
List<Object[]> list = session.createQuery(hql).list();
for (Object[] string : list) {
System.out.println(Arrays.toString(string));
}
}
/**
* 情況四:利用hibernate內建函式進行處理
* map不區分大小寫,是hibernate內建的函式
*/
@Test
public void testList4() {
String hql = "select new map(bookId,bookName) from Book";
List<Map> list = session.createQuery(hql).list();
for (Map string : list) {
System.out.println(string);
}
}
/**
* 情況五:利用構造方法處理結果
* 先提供這些引數的構造方法
*/
@Test
public void testList5() {
String hql = "select new Book(bookId,bookName) from Book";
List<Book> list = session.createQuery(hql).list();
for (Book string : list) {
System.out.println(string);
}
}
/**
* hql中使用佔位符
* hql:from Book where BookId = ?/:xxx/:BookId
* hibernate5之後不再支援?佔位符
*
*/
@Test
public void testList6() {
// String hql = "from Book where bookId = :BookId";
// Query query = session.createQuery(hql);
// query.setParameter("BookId", 2);
// //查單個
// Book o = (Book) query.getSingleResult();
// System.out.println(o);
// 指定id的書籍
// String hql = "from Book where price > :min and price < :max";
// Query query = session.createQuery(hql);
// query.setParameter("min",10f);
// query.setParameter("max", 15f);
// 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);
List<Integer> l = new ArrayList<>();
l.add(1);
l.add(2);
l.add(3);
query.setParameterList("bookIds", l);
// query.setParameterList("bookIds", new Integer[] {2,4,5,});
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
/**
* 聯表查詢
* 用
* hql: select * from Order o,OrderItem oi
* where o.OrderId = oi.order.orderId
*
*/
@Test
public void testList7() {
//通過物件的屬性或者直接通過物件來關聯
// String hql = "select o.orderNo,oi.quantity from Order o,OrderItem oi where o.orderId = oi.order.orderId";
String hql = "select o.orderNo,oi.quantity 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 o = query.getSingleResult();
System.out.println(o);
}
/**
* hibernate中的分頁
* select * from
* 需要查詢不同的資料庫需要在主配置檔案中修改配置檔案
*/
@Test
public void testList9() {
String hql = " from Book where bookName like :bname";
int rows = 3;
int page = 2;
Query query = session.createQuery(hql);
query.setParameter("bname", "%不%");
//設定查詢的起始位置
query.setFirstResult((page-1)*rows);
//設定每頁的資料量
query.setMaxResults(rows);
List<Book> list = query.list();
for (Book book : list) {
System.out.println(book);
}
}
// 執行完測試方法會呼叫
@After
public void after() {
transaction.commit();
session.close();
}
}