目錄
使用環境:多表查詢,條件不復雜時使用
查詢所有對象
@Test
public void test4(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~~~~
//1.書寫Hql 可以書寫完整的類名,如果類名在項目中唯一也可以簡寫 如果是查詢對象所有信息,即select * 則可以省略
//string hql = "from com.ycsj.domain.Customer"; //書寫完整類型 省略select *
String hql = "from Customer"; //項目中唯一類名
//2.根據hql創建查詢對象
Query query = session.createQuery(hql);
//3.查詢
//返回list結果
List<Customer> list = query.list();
//返回單個對象
//query.uniqueResult();
System.out.println(list);
//~~~~~~~~~~~~~~
tx.commit();
}
條件查詢
/**
* 條件查詢
* 在hql語句中不會出現數據庫相關的信息 條件中where子句查詢的是實體類中的字段
*/
@Test
public void test5(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~~~~
//1.書寫Hql
//string hql = "from com.ycsj.domain.Customer";
String hql = "from Customer where cust_id=1";
//2.根據hql創建查詢對象
Query query = session.createQuery(hql);
//3.查詢
//返回list結果
// List<Customer> list = query.list();
//返回單個對象
Customer custormer = (Customer) query.uniqueResult();
System.out.println(custormer);
//~~~~~~~~~~~~~~
tx.commit();
}
使用帶問號站位符的條件查詢
/**
* 條件查詢
* 問號佔位符 在新版本的hibernate框架中使用?+數字 來替代,原來的問號
*/
@Test
public void test6(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~~~~
//1.書寫Hql
//string hql = "from com.ycsj.domain.Customer";
String hql = "from Customer where cust_id=?0";
//2.根據hql創建查詢對象
Query query = session.createQuery(hql);
//設置參數
query.setParameter(0,1);
//3.查詢
//返回list結果
// List<Customer> list = query.list();
//返回單個對象
Customer custormer = (Customer) query.uniqueResult();
System.out.println(custormer);
//~~~~~~~~~~~~~~
tx.commit();
}
使用命名佔位符的條件查詢
/**
* 條件查詢
* 命名佔位符:+命名
*/
@Test
public void test7(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~~~~
//1.書寫Hql
//string hql = "from com.ycsj.domain.Customer";
String hql = "from Customer where cust_id=:cust_id";
//2.根據hql創建查詢對象
Query query = session.createQuery(hql);
//設置參數
query.setParameter("cust_id",1); //與上面的命名相對應
//3.查詢
//返回list結果
// List<Customer> list = query.list();
//返回單個對象
Customer custormer = (Customer) query.uniqueResult();
System.out.println(custormer);
//~~~~~~~~~~~~~~
tx.commit();
}
分頁查詢
/**
* 分頁查詢
*/
@Test
public void test8(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~~~~
//1.書寫Hql
//string hql = "from com.ycsj.domain.Customer";
String hql = "from Customer";
//2.根據hql創建查詢對象
Query query = session.createQuery(hql);
//設置分頁信息
query.setFirstResult(0);
query.setMaxResults(1);
//3.查詢
//返回list結果
List<Customer> list = query.list();
//返回單個對象
//Customer custormer = (Customer) query.uniqueResult();
System.out.println(list);
//~~~~~~~~~~~~~~
tx.commit();
}
排序
@Test
public void test1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~
String hql = " from LinkMan order by lkm_id asc";
String hql2 = " from LinkMan order by lkm_id desc";
Query query = session.createQuery(hql2);
List<LinkMan> list = query.list();
System.out.println(list);
//~~~~~~~~~~~~~~~~~
tx.commit();
session.close();
}
聚合函數
//count
//max
//min
//avg
@Test
public void test2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~
String hql = " select count(*) from LinkMan order";
String hql2 = " select avg(lkm_id) from LinkMan order";
String hql3 = " select max(lkm_id) from LinkMan order";
String hql4 = " select min(lkm_id) from LinkMan order";
Query query = session.createQuery(hql3);
Number number = (Number) query.uniqueResult();
System.out.println(number);
//~~~~~~~~~~~~~~~~~
tx.commit();
session.close();
}
投影檢索
就是不查詢所有 只查詢部分字段
@Test
public void test3(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~
String hql1 = " select lkm_name from LinkMan";
String hql2 = " select lkm_id,lkm_name from LinkMan"; //返回數組
String hql3 = " select new LinkMan(lkm_id,lkm_name) from LinkMan"; //需要在實體類中創建響應的構造函數 自動封裝到對象中
Query query = session.createQuery(hql3);
//查詢某一列,將查詢出來的結果封裝到一個數組中
List list = query.list();
System.out.println(list);
//~~~~~~~~~~~~~~~~~
tx.commit();
session.close();
}
多表查詢
/*回顧原生sql * 交叉連接 ---笛卡爾積 *select * from A,B A中有m條記錄 B中有n條記錄 查詢結果有m*n條記錄 這種情況的應用場景幾乎沒有 *內連接 * |----隱式內連接 * select * from A,B where A.xxx=B.yyy; * |----顯示內連接 * select * from A inner join B on B.aid=A.id; 查詢交集 * 外連接 * |----左外 * select * from A left[outer] join B on B.aid=A.id; * |----右外 * select * from A right[outer] join B on B.aid=A.id; * * */
Hql支持破切查詢 fetch
/**
* hql多表查詢
* 內連接 將數據封裝到數組中
*
* [Ljava.lang.Object;@5432c277
* [Ljava.lang.Object;@15e0fe05
* [Ljava.lang.Object;@1128620c
* [Ljava.lang.Object;@6bf13698
*/
@Test
public void test(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~~~~~~~~~~~
String hql = " from Customer c inner join c.linkMans";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] arr:list){
System.out.println(arr);
}
//~~~~~~~~~~~~~~~~~~~~~~~~
tx.commit();
session.close();
}
/**
* 迫切內連接 幫助把數據封裝到對象中
*[Customer{cust_id=1, cust_name='zhiduowa', linkMans=[LinkMan{lkm_id=1, lkm_name='董事長'}, LinkMan{lkm_id=2, lkm_name='總經理'}]}
*/
@Test
public void test1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~~~~~~~~~~~
String hql = " from Customer c inner join fetch c.linkMans";
Query query = session.createQuery(hql);
List<Customer> list = query.list();
System.out.println(list);
//~~~~~~~~~~~~~~~~~~~~~~~~
tx.commit();
session.close();
}
/**
* 左外連接 左邊的數據都會顯示
*/
@Test
public void test3(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~~~~~~~~~~~
String hql = " from Customer c left join c.linkMans";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] arr:list){
System.out.println(arr);
}
//~~~~~~~~~~~~~~~~~~~~~~~~
tx.commit();
session.close();
}
/**
* 右外連接 右邊的數據都會顯示 被連接的數據全部顯示 不管有沒有對應
*/
@Test
public void test4(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//~~~~~~~~~~~~~~~~~~~~~~~~
String hql = " from Customer c right join c.linkMans";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] arr:list){
System.out.println(arr);
}
//~~~~~~~~~~~~~~~~~~~~~~~~
tx.commit();
session.close();
}
}