HQL查詢:hibernate獨有的查詢語言 適用於不複雜的多表查詢 示例: 實體類: package domain; public class Customer { private Long cust_id; private String cust_name; private String cus ...
HQL查詢:hibernate獨有的查詢語言
適用於不複雜的多表查詢
示例:
實體類:
package domain; public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkman; private String cust_phone; private String cust_mobile; public Long getCust_id() { return cust_id; } public void setCust_id(Long cust_id) { this.cust_id = cust_id; } public String getCust_name() { return cust_name; } public void setCust_name(String cust_name) { this.cust_name = cust_name; } public String getCust_source() { return cust_source; } public void setCust_source(String cust_source) { this.cust_source = cust_source; } public String getCust_industry() { return cust_industry; } public void setCust_industry(String cust_industry) { this.cust_industry = cust_industry; } public String getCust_level() { return cust_level; } public void setCust_level(String cust_level) { this.cust_level = cust_level; } public String getCust_linkman() { return cust_linkman; } public void setCust_linkman(String cust_linkman) { this.cust_linkman = cust_linkman; } public String getCust_phone() { return cust_phone; } public void setCust_phone(String cust_phone) { this.cust_phone = cust_phone; } public String getCust_mobile() { return cust_mobile; } public void setCust_mobile(String cust_mobile) { this.cust_mobile = cust_mobile; } @Override public String toString() { return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]"; } }View Code
自定義工具類:
package utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory sf; static{ //1 創建,調用空參構造 Configuration conf = new Configuration().configure(); //2 根據配置信息,創建 SessionFactory對象 sf = conf.buildSessionFactory(); } //獲得session => 獲得全新session public static Session openSession(){ //3 獲得session Session session = sf.openSession(); return session; } //獲得session => 獲得與線程綁定的session public static Session getCurrentSession(){ //3 獲得session Session session = sf.getCurrentSession(); return session; } }View Code
測試類:
package hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import domain.Customer; import utils.HibernateUtils; //測試HQL語句 public class Demo { @Test //基本查詢 public void fun1(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //1> 書寫HQL語句 //String hql = " from domain.Customer "; String hql = " from Customer "; // 如果查詢所有Customer對象,可省略全名 //2> 根據HQL語句創建查詢對象 Query query = session.createQuery(hql); //3> 根據查詢對象獲得查詢結果 List<Customer> list = query.list(); // 返回list結果 //query.uniqueResult();//接收唯一的查詢結果 System.out.println(list); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //條件查詢 //HQL語句中,不可能出現任何資料庫相關的信息的 //不會出現資料庫的表名類名欄位名,使用的是實體類的屬性名 public void fun2(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //1> 書寫HQL語句 String hql = " from Customer where cust_id = 1 "; // 查詢所有Customer對象 //2> 根據HQL語句創建查詢對象 Query query = session.createQuery(hql); //3> 根據查詢對象獲得查詢結果 Customer c = (Customer) query.uniqueResult(); System.out.println(c); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //條件查詢 //問號占位符 public void fun3(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //1> 書寫HQL語句 String hql = " from Customer where cust_id = ? "; // 查詢所有Customer對象 //2> 根據HQL語句創建查詢對象 Query query = session.createQuery(hql); //設置參數 //query.setLong(0, 1l); query.setParameter(0, 1l); //3> 根據查詢對象獲得查詢結果 Customer c = (Customer) query.uniqueResult(); System.out.println(c); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //條件查詢 //命名占位符 public void fun4(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //1> 書寫HQL語句 String hql = " from Customer where cust_id = :cust_id "; // 查詢所有Customer對象 //2> 根據HQL語句創建查詢對象 Query query = session.createQuery(hql); //設置參數 query.setParameter("cust_id", 1l); //3> 根據查詢對象獲得查詢結果 Customer c = (Customer) query.uniqueResult(); System.out.println(c); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //分頁查詢 public void fun5(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //1> 書寫HQL語句 String hql = " from Customer "; // 查詢所有Customer對象 //2> 根據HQL語句創建查詢對象 Query query = session.createQuery(hql); //設置分頁信息 limit ?,? query.setFirstResult(0); query.setMaxResults(1); //3> 根據查詢對象獲得查詢結果 List<Customer> list = query.list(); System.out.println(list); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } }
Criteria查詢:
hibernate獨創的,無語句面向對象查詢
適用於單表查詢
示例:
package criteria; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.junit.Test; import domain.Customer; import utils.HibernateUtils; //測試Criteria查詢 public class Demo { @Test //基本查詢 public void fun1(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //查詢所有的Customer對象 Criteria criteria = session.createCriteria(Customer.class); List<Customer> list = criteria.list(); System.out.println(list); // Customer c = (Customer) criteria.uniqueResult(); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //條件查詢 //HQL語句中,不可能出現任何資料庫相關的信息的 // > gt // >= ge // < lt // <= le // == eq // != ne // in in // between and between // like like // is not null isNotNull // is null isNull // or or // and and public void fun2(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //創建criteria查詢對象 Criteria criteria = session.createCriteria(Customer.class); //添加查詢參數 => 查詢cust_id為1的Customer對象 criteria.add(Restrictions.gt("cust_id", 1l)); //執行查詢獲得結果 Customer c = (Customer) criteria.uniqueResult(); System.out.println(c); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //分頁查詢 public void fun3(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //創建criteria查詢對象 Criteria criteria = session.createCriteria(Customer.class); //設置分頁信息 limit ?,? criteria.setFirstResult(1); criteria.setMaxResults(2); //執行查詢 List<Customer> list = criteria.list(); System.out.println(list); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //查詢總記錄數 public void fun4(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //創建criteria查詢對象 Criteria criteria = session.createCriteria(Customer.class); //設置查詢的聚合函數 => 總行數 criteria.setProjection(Projections.rowCount()); //執行查詢 Long count = (Long) criteria.uniqueResult(); System.out.println(count); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } }
原生SQL查詢:
適用於相當複雜的業務
package sql; import java.util.Arrays; import java.util.List; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import domain.Customer; import utils.HibernateUtils; //測試原生SQL查詢 public class Demo { @Test //基本查詢 public void fun1(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //1 書寫sql語句 String sql = "select * from cst_customer"; //2 創建sql查詢對象 SQLQuery query = session.createSQLQuery(sql); //3 調用方法查詢結果 List<Object[]> list = query.list(); //query.uniqueResult(); for(Object[] objs : list){ System.out.println(Arrays.toString(objs)); } //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //基本查詢 public void fun2(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //1 書寫sql語句 String sql = "select * from cst_customer"; //2 創建sql查詢對象 SQLQuery query = session.createSQLQuery(sql); //指定將結果集封裝到哪個對象中 query.addEntity(Customer.class); //3 調用方法查詢結果 List<Customer> list = query.list(); System.out.println(list); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //條件查詢 public void fun3(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //1 書寫sql語句 String sql = "select * from cst_customer where cust_id = ? "; //2 創建sql查詢對象 SQLQuery query = session.createSQLQuery(sql); query.setParameter(0, 1l); //指定將結果集封裝到哪個對象中 query.addEntity(Customer.class); //3 調用方法查詢結果 List<Customer> list = query.list(); System.out.println(list); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } @Test //分頁查詢 public void fun4(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 //------------------------------------------- //1 書寫sql語句 String sql = "select * from cst_customer limit ?,? "; //2 創建sql查詢對象 SQLQuery query = session.createSQLQuery(sql); query.setParameter(0, 0); query.setParameter(1, 1); //指定將結果集封裝到哪個對象中 query.addEntity(Customer.class); //3 調用方法查詢結果 List<Customer> list = query.list(); System.out.println(list); //------------------------------------------- //4提交事務.關閉資源 tx.commit(); session.close(); } }