求助,這樣查詢的hql語句應該怎么寫?我想通過UId查詢PCre 愛問知
top語法HQL不支持 變通的方法是 String HQL = "from Photo p where *='"+id+"' order by PCredit desc"; Query query = *Query(HQL); //設定起始位置 *stResult(0); //設定個數 *Results(2); //返回值是一個list,里面就是排序的前兩個對象 List resList = *(); 謝謝!。
hibernate中的查詢方式有哪些
hibernate的查詢方式主要有以下幾種,你可以看看,也可以去官方下載文檔來看看,不過是英文版本。
希望對你有幫助,謝謝hibernate查詢方式 ? 小結Hibernate。 ? Hibernate對多。
? hibernate查詢。 ? Hibernate之查。
? Hibernate 查。 更多相關推薦。
在HQL中關鍵字不區分大小寫,但是屬性和類名區分大小寫,下面介紹各種類型的Hibernate的HQL查詢。1、Hibernate HQL查詢:簡單屬性查詢* 單一屬性查詢,返回結果集屬性列表,元素類型和實體類中相應的屬性類型一致* 多個屬性查詢,返回的集合元素是對象數組,數組元素的類型和對應的屬性在實體類中的類型一致 數組的長度取決與select中屬性的個數* 如果認為返回數組不夠對象化,可以采用HQL動態實例化Student對象2、Hibernate HQL查詢:實體對象查詢* N + 1問題,在默認情況下,使用*e查詢,有可以能出現N+1問題,所謂的N+1是在查詢的時候發出了N+1條sql語句,1: 首先發出一條查詢對象id列表的sql,N: 根據id列表到緩存中查詢,如果緩存中不存在與之匹配的數據,那么會根據id發出相應的sql語句* list和iterate的區別?* list每次都會發出sql語句,list會向緩存中放入數據,而不利用緩存中的數據* iterate:在默認情況下iterate利用緩存數據,但如果緩存中不存在數據有可以能出現N+1問題3、Hibernate HQL查詢:條件查詢* 可以采用拼字符串的方式傳遞參數Java代碼:List students = *Query("select *, * from Student s where * like '%1%'").list(); * 可以采用 ?來傳遞參數(索引從0開始)Java代碼:List students = *Query("select *, * from Student s where * like ?").setParameter(0, "%1%").list(); //可以使用?方式傳遞參數 //參數的索引從0開始 //傳遞的參數值,不用單引號引起來 //注意方法鏈編程 * 可以采用 :參數名 來傳遞參數Java代碼:List students = *Query ("select *, * from Student s where * like :myname").setParameter("myname", "%1%").list(); * 如果傳遞多個參數,可以采用setParamterList方法Java代碼:List students = *Query("select *, * from Student s where * in(:myids)").setParameterList("myids", new Object[]{1, 2, 3, 4, 5}).list(); * 在HQL中可以使用數據庫的函數,如:date_formatJava代碼:List students = *Query("select *, * from Student s where date_format(*Time, '%Y-%m')=?").setParameter(0, "2008-02").list(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //查詢2008-01-10到2008-02-15創建的學生 List students = *Query("select *, * from Student s where *Time between ? and ?") ..setParameter(0, *("2008-01-10 00:00:00")) .setParameter(1, *("2008-02-15 23:59:59")) .list(); 4、Hibernate HQL查詢:直接使用sql進行查詢Java代碼:List students = *SQLQuery("select * from t_student").list(); 不會返回對象,而是所有屬性! 5、Hibernate HQL查詢:分頁查詢* setFirstResult(),從0開始* setMaxResults,每頁顯示多少條數據Java代碼:List students = *Query("from Student") .setFirstResult(1) .setMaxResults(2) .list(); 6、Hibernate HQL查詢:對象導航查詢,在HQL中采用 . 進行導航7、Hibernate HQL查詢:連接查詢* 內連Sql代碼:SELECT *, * FROM Student s (inner) join *s c * 外連接(左連接/右連接)Sql代碼:SELECT *, * FROM Student s left join *s c 8、Hibernate HQL查詢:統計查詢Java代碼: List students =*Query("select *, count(s) from Student s join *s c " +"group by * order by *").list(); for (Iterator iter=*or(); *t();) { Object[] obj = (Object[])*(); *n(obj[0] + ", " + obj[1]); } 9、DML風格的操作(盡量少用,因為和緩存不同步)Java代碼:*Query ("update Student s set *=? where *< ?") .setParameter(0, "李四") .setParameter(1, 5) .executeUpdate(); 應當盡量少用,因為和緩存不同步,也就是說,假如在執行上面的語句之前,已經把student封裝成一個list曾經拿了出來,再執行上面的語句對 student中的表進行數據更新,然后再list Student表,則此時的list是從緩存中取的數據,而不是從表中找到的數據,也就是 說,list拿到的是update前的數據,所以造成了這種不同步,所以這種風格盡量少用。
從這個方面也可以看得出Hibernate并不適用于聚集性,統計,大量批量的更新,刪除等操作。
hibernate查詢語言
1 .from1.1單表查詢from * as cat.其中,cat只是一個別名,為了用其他子語句的時候書寫簡單1.2多表查詢from *,*m * as cat,* as dog2 join相關(inner) joinleft (outer) joinright (outer) joinfull joinHQL同樣對SQL中的這些特性支持下面插播一個小話題,關于上邊的那些特性,我一直都沒怎么用,今天既然說到這里,就想把上邊的幾個特性的用法說一下,也算對自己的一個補充:假設有兩個表:部門、員工,下面列舉一些數據:員工(Employee):ID Name DepNo001 Jplateau 01002 Jony 01003 Camel 02部門(Department):ID Name01 研發部02 營銷部在Hibernate中我們操縱的都是對象,所以我們操縱的是部門類和員工類1).(inner) joinselect * as id1,* as name1,* as id2,* name2 from Employee as employee join Department as department on *=* (注意到條件語句我用on 沒有用where)那么執行結果是什么呢?id1 name1 id2 name2++++++++++++++++++++++++++++++++++++++001 Jplateau 01 研發部002 Jony 01 研發部2).left (outer) joinselect * as id1,* as name1,* as id2,* name2 from Employee as employee left join Department as department on *=* 那么執行結果又該是什么呢?id1 name1 id2 name2++++++++++++++++++++++++++++++++++++++001 Jplateau 01 研發部002 Jony 01 研發部 003 Camel null null {就是說此時我要已第一個表的記錄多少為準,第二個表中沒有相應紀錄的時候填充null} 3). right (outer) joinselect * as id1,* as name1,* as id2,* name2 from Employee as employee right join Department as department on *=* 那么執行結果又該是什么呢?id1 name1 id2 name2++++++++++++++++++++++++++++++++++++++001 Jplateau 01 研發部002 Jony 01 研發部 null null 02 營銷部 {就是說此時我要已第二個表的記錄多少為準,第一個表中沒有相應紀錄的時候填充null} 3 大小寫敏感4。
select語句就是要確定你要從查詢中返回哪些對象或者哪些對象的屬性。寫幾個例子吧:select employee form Employee as employee select employee form Employee as employee where * like 'J%'select * form Employee as employee where * like 'J%'select * as id1,* as name1,* as id2,* name2 from Employee as employee right join Department as department on *=* select elements(*) from Employee as employee (不明白elements到底是做什么用的?望給于說明) 等等5。
數學函數JDO目前好像還不支持此類特性。avg(。
), sum(。), min(。
), max(。) count(*) count(。
), count(distinct 。), count(all。
) 其用法和SQL基本相同select distinct * from Employee as employee select count(distinct *),count(employee) from Employee as employee 6。polymorphism (暫時不知道如何解釋?)from * as animal不光得到所有Animal得實例,而且可以得到所有Animal的子類(如果我們定義了一個子類Cat)一個比較極端的例子from * as o可以得到所有持久類的實例7。
where語句定義查詢語句的條件,舉幾個例子吧:from Employee as employee where *='Jplateau'from Employee as employee where * like 'J%'from Employee as employee where * like '%u'在where語句中“=”不光可以比較對象的屬性,也可以比較對象,如:select animal from * as animal where *=dog8。表達式在SQL語句中大部分的表達式在HQL中都可以使用:mathematical operators +, -, *, / binary comparison operators =, >=, <=, <>, !=, like logical operations and, or, not string concatenation || SQL scalar functions like upper() and lower() Parentheses ( ) indicate grouping in, between, is null JDBC IN parameters ? named parameters :name, :start_date, :x1 (這種應該是另一種"?"的變通解決方法)SQL literals 'foo', 69, '1970-01-01 10:00:01.0' Java public static final constants * 其他不必解釋了,在這里我只想對查詢中的參數問題說明一下:大家知道在SQL中進行傳遞參數進行查詢的時候,我們通常用PreparedStatement,在語句中寫一大堆的“?”,在hql中也可以用這種方法,如:List mates = *("select * from Employee as employee " +"where *=? ",name,*);(說明:上面利用Session里的find方法,在hibernate的api Session中重載了很多find方法。