常用的Hql語句, Hibernate查詢語句

原文鏈接:https://www.cnblogs.com/logsharing/p/8182794.html

HQL定義

HQL:Hibernate Query Language, Hibernate查詢語句

HQL 查詢語句是面向對象的, Hibernate 負責解析 HQL 查詢語句, 然後根據對象-關係映射文件中的映射信息, 把 HQL 查詢語句翻譯成相應的 SQL 語句。HQL 查詢語句中的主體是域模型中的類及類的屬性。

SQL 查詢語句是與關係數據庫綁定在一起的。SQL 查詢語句中的主體是數據庫表及表的字段。

 

一、// HQL: Hibernate Query Language.


 // 特點:
// >> 1,與SQL相似,SQL中的語法基本上都可以直接使用。
// >> 2,SQL查詢的是表和表中的列;HQL查詢的是對象與對象中的屬性。
// >> 3,HQL的關鍵字不區分大小寫,類名與屬性名是區分大小寫的。
// >> 4,SELECT可以省略.

// 1,簡單的查詢,Employee爲實體名而不是數據庫中的表名(面向對象特性)

hql = "FROM Employee";
hql = "FROM Employee AS e"; // 使用別名
hql = "FROM Employee e"; // 使用別名,as關鍵字可省略

// 2,帶上過濾條件的(可以使用別名):Where

hql = "FROM Employee WHERE id<10";
hql = "FROM Employee e WHERE e.id<10";
hql = "FROM Employee e WHERE e.id<10 AND e.id>5";

// 3,帶上排序條件的:Order By

hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name";
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC";
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC, id ASC";

// 4,指定select子句(不可以使用select *)

hql = "SELECT e FROM Employee e"; // 相當於"FROM Employee e"
hql = "SELECT e.name FROM Employee e"; // 只查詢一個列,返回的集合的元素類型就是這個屬性的類型
hql = "SELECT e.id,e.name FROM Employee e"; // 查詢多個列,返回的集合的元素類型是Object數組
hql = "SELECT new Employee(e.id,e.name) FROM Employee e"; // 可以使用new語法,指定把查詢出的部分屬性封裝到對象中

// 5,執行查詢,獲得結果(list、uniqueResult、分頁 )

Query query = session.createQuery("FROM Employee e WHERE id<3");
query.setFirstResult(0);
query.setMaxResults(10); // 等同於 limit 0,10
//兩種查詢結果list、uniqueResult
// List list = query.list(); // 查詢的結果是一個List集合
// Employee employee = (Employee) query.uniqueResult();// 查詢的結果是唯一的一個結果,當結果有多個,就會拋異常

// 6,方法鏈

List list = session.createQuery(//
"FROM Employee e")//
.setFirstResult(0)//
.setMaxResults(10)//
.list();

// 7,聚集函數:count(), max(), min(), avg(), sum()

hql = "SELECT COUNT(*) FROM Employee"; // 返回的結果是Long型的
hql = "SELECT min(id) FROM Employee"; // 返回的結果是id屬性的類型

//8,分組: Group By ... Having

hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name";
hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name HAVING count(e.id)>1";
hql = "SELECT e.name,COUNT(e.id) FROM Employee e WHERE id<9 GROUP BY e.name HAVING count(e.id)>1";
hql = "SELECT e.name,COUNT(e.id) " + //
"FROM Employee e " + //
"WHERE id<9 " + //
"GROUP BY e.name " + //
"HAVING count(e.id)>1 " + //
"ORDER BY count(e.id) ASC";
hql = "SELECT e.name,COUNT(e.id) AS c " + //
"FROM Employee e " + //
"WHERE id<9 " + //
"GROUP BY e.name " + //
"HAVING count(e.id)>1 " + // 在having子句中不能使用列別名
"ORDER BY c ASC"; // 在orderby子句中可以使用列別名

// 9,連接查詢 / HQL是面向對象的查詢
//>> 內連接(inner關鍵字可以省略)

hql = "SELECT e.id,e.name,d.name FROM Employee e JOIN e.department d";
hql = "SELECT e.id,e.name,d.name FROM Employee e INNER JOIN e.department d";
//>> 左外連接(outer關鍵字可以省略)
hql = "SELECT e.id,e.name,d.name FROM Employee e LEFT OUTER JOIN e.department d";
//>> 右外連接(outer關鍵字可以省略)
hql = "SELECT e.id,e.name,d.name FROM Employee e RIGHT JOIN e.department d";
//可以使用更方便的方法
hql = "SELECT e.id,e.name,e.department.name FROM Employee e";

// 10,查詢時使用參數
// >> 方式一:使用'?'佔位

hql = "FROM Employee e WHERE id BETWEEN ? AND ?";
List list2 = session.createQuery(hql)//
.setParameter(0, 5)// 設置參數,第1個參數的索引爲0。
.setParameter(1, 15)//
.list();

// >> 方式二:使用變量名

hql = "FROM Employee e WHERE id BETWEEN :idMin AND :idMax";
List list3 = session.createQuery(hql)//
.setParameter("idMax", 15)//
.setParameter("idMin", 5)//
.list();

// 當參數是集合時,一定要使用setParameterList()設置參數值

hql = "FROM Employee e WHERE id IN (:ids)";
List list4 = session.createQuery(hql)//
.setParameterList("ids", new Object[] { 1, 2, 3, 5, 8, 100 })//
.list();

// 11,update與delete,不會通知Session緩存
// >> Update

int result = session.createQuery(//
"UPDATE Employee e SET e.name=? WHERE id>15")//
.setParameter(0, "無名氏")//
.executeUpdate(); // 返回int型的結果,表示影響了多少行。

// >> Delete

int result1 = session.createQuery(//
"DELETE FROM Employee e WHERE id>15")//
.executeUpdate(); // 返回int型的結果,表示影響了多少行。

二、1. 查詢整個映射對象所有字段


//直接from查詢出來的是一個映射對象,即:查詢整個映射對象所有字段  
        String hql = "from Users";  
        Query query = session.createQuery(hql);  
        List<Users> users = query.list();  
        for(Users user : users){  
            System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());  
        }

 輸出結果爲:  
name1 : password1 : 1 
name2 : password2 : 2 
name3 : password3 : 3 

2.查詢字段  

    //查詢其中幾個字段  
        String hql = " select name,passwd from Users";  
        Query query = session.createQuery(hql);  
        //默認查詢出來的list裏存放的是一個Object數組  
        List<Object[]> list = query.list();  
        for(Object[] object : list){  
            String name = (String)object[0];  
            String passwd = (String)object[1];        
            System.out.println(name + " : " + passwd);  
        } 

輸出結果爲:  
name1 : password1  
name2 : password2  
name3 : password3 

3.修改默認查詢結果(query.list())不以Object[]數組形式返回,以List形式返回

//查詢其中幾個字段,添加new list(),注意list裏的l是小寫的。也不需要導入包,這樣通過query.list()出來的list裏存放的不再是默認的Object數組了,而是List集合了 
         String hql = " select new list(name,passwd) from Users";  
        Query query = session.createQuery(hql);  
        //默認查詢出來的list裏存放的是一個Object數組,但是在這裏list裏存放的不再是默認的Object數組了,而是List集合了  
        List<List> list = query.list();  
        for(List user : list){  
            String name = (String)user.get(0);  
            String passwd = (String)user.get(1);  
            System.out.println(name + " : " + passwd);  
        } 

輸出結果爲: 
name1 : password1         
name2 : password2 
name3 : password3 

4.修改默認查詢結果(query.list())不以Object[]數組形式返回,以Map形式返回

//查詢其中幾個字段,添加new map(),注意map裏的m是小寫的。也不需要導入包,這樣通過query.list()出來的list裏存放的不再是默認的Object數組了,而是map集合了  
        String hql = " select new map(name,passwd) from Users";  
        Query query = session.createQuery(hql);  
        //默認查詢出來的list裏存放的是一個Object數組,但是在這裏list裏存放的不再是默認的Object數組了,而是Map集合了  
        List<Map> list = query.list();  
        for(Map user : list){  
            //一條記錄裏所有的字段值都是map裏的一個元素,key是字符串0,1,2,3....,value是字段值  
            //如果將hql改爲:String hql = " select new map(name as username,passwd as password) from Users";,那麼key將不是字符串0,1,2...了,而是"username","password"了  
            String name = (String)user.get("0");//get("0");是get(key),注意:0,1,2...是字符串,而不是整形  
            String passwd = (String)user.get("1");  
            System.out.println(name + " : " + passwd);  
        }  

        /** 
        輸出結果爲: 
         name1 : password1 
        name2 : password2 
        name3 : password3 
         */ 

 

5.修改默認查詢結果(query.list())不以Object[]數組形式返回,以自定義類型返回

 

6.條件查詢

//條件查詢,參數索引值從0開始,索引位置。通過setString,setParameter設置參數
        String hql = "from Users where name=? and passwd=?";  
        Query query = session.createQuery(hql);  
        //第1種方式  
//      query.setString(0, "name1");  
//      query.setString(1, "password1");  
        //第2種方式  
        query.setParameter(0, "name1",Hibernate.STRING);  
        query.setParameter(1, "password1",Hibernate.STRING);  
        List<Users> list = query.list();  
        for(Users users : list){  
            System.out.println(users.getId());  
        }  

 

//條件查詢,自定義索引名(參數名):username,:password.通過setString,setParameter設置參數 
        String hql = "from Users where name=:username and passwd=:password";  
        Query query = session.createQuery(hql);  
        //第1種方式  
//      query.setString("username", "name1");  
//      query.setString("password", "password1");  
        //第2種方式,第3個參數確定類型  
        query.setParameter("username", "name1",Hibernate.STRING);  
        query.setParameter("password", "password1",Hibernate.STRING);  
        List<Users> list = query.list();  
        for(Users users : list){  
            System.out.println(users.getId());  
        } 

 

//條件查詢,通過setProperties設置參數  
        String hql = "from Users where name=:username and passwd=:password";  
        Query query = session.createQuery(hql);  
        //MyUser類的2個屬性必須和:username和:password對應  
        MyUser myUser = new MyUser("name1","password1");  
        query.setProperties(myUser);  
        List<Users> list = query.list();  
        for(Users users : list){  
            System.out.println(users.getId());  
        } 

 

7.update 數據

   執行SQL語句(爲什麼要用SQL語句,我想是爲了執行某些複雜的SQL語句吧) 

String sql="update Table set field = 'test'"
Session session = HibernateSessionFactory.getSession();
session.createSQLQuery(sql).executeUpdate();
ts.commit();

執行HQL語句   


String hql="update Table set field = 'test'"

Session session = HiberanteSessionFactory.getSession();
Transaction ts = session.beginTransaction();
Query query = session.createQuery(hql);
query.executeUpdate();
ts.commit();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章