在hql中關(guān)鍵字不區(qū)分大小寫,但是屬性和類名區(qū)分大不寫
簡(jiǎn)單屬性查詢[重要]
1 單一屬性查詢,返回結(jié)果集屬性列表,元素類型和實(shí)體類中相應(yīng)的屬性類型一致
List students=session.createQuery("select name from Student").list();

for(Iterator iter=students.iterator();iter.hasNext();)
{
String name=(String)iter.next();
System.out.println(name);
}
2 多個(gè)屬性查詢,返回的集合元素是對(duì)象數(shù)組
數(shù)組元素的類型和對(duì)應(yīng)的屬性在實(shí)體類中的類型一致
數(shù)組的長度取決于select中屬性的個(gè)數(shù)
List students=session.createQuery("select id, name from Student").list();

for(Iterator iter=students.iterator();iter.hasNext();)
{
Object[] obj=(Object[])iter.next();
System.out.println(obj[0]+":"+obj[1]);
}
3 對(duì)象化查詢,可以采用hql動(dòng)態(tài)實(shí)例化Student對(duì)象,此時(shí)list中為Student對(duì)象集合
注意,必須有在實(shí)體類中有相應(yīng)的構(gòu)造方法
List students=session.createQuery("select new Student(id, name) from Student").list();

for(Iterator iter=students.iterator();iter.hasNext();)
{
Student stu=(Student)iter.next();
System.out.println(stu.getId()+":"+stu.getName());
}
4 別名查詢,可以使用as命名別名
List students=session.createQuery("select s.id, s.name from Student as s").list();

for(Iterator iter=students.iterator();iter.hasNext();)
{
Object[] obj=(Object[])iter.next();
System.out.println(obj[0]+":"+obj[1]);
}
5 實(shí)體屬性
setEntity();
實(shí)體對(duì)象查詢[重要]
1 忽略select,返回Student對(duì)象的集合,可以忽略select
List students=session.createQuery("from Student").list();

for(Iterator iter=students.iterator();iter.hasNext();)
{
Student stu=(Student)iter.next();
System.out.println(stu.getName()+":"+stu.getCreateTime());
}
2 使用別名,返回Student對(duì)象的集合,可以使用別名,兩種方式都支持:空格或as
List students=session.createQuery("from Student s").list();
List students=session.createQuery("from Student as s").list();

for(
.)
{
.}
3 使用select,返回Student對(duì)象的集合,使用select用,必須使用別名
List students=session.createQuery("select s from Student as s").list();

for(
.)
{
.}
4 不支持select * from...這樣的查詢
[X]List students=session.createQuery("select * from Student s").list();//錯(cuò)誤的[X]
5 使用query.iterate查詢
在默認(rèn)情況下,使用query.iterate查詢,有可能出現(xiàn)N+1問題
所謂N+1是在查詢的時(shí)候發(fā)出N+1條sql語句
* 1:先發(fā)出查詢id的sql
* N:再依次發(fā)出根據(jù)id查詢Student對(duì)象的sql
Iterator iter=session.createQuery("from Student").iterate();

while(iter.hasNext())
{
Student stu=(Student)iter.next();
System.out.println(stu.getName()+":"+stu.getCreateTime());
}
6 使用query.list查詢,返回Student對(duì)象的集合
在默認(rèn)情況下list每次都會(huì)向數(shù)據(jù)庫發(fā)出查詢對(duì)象的sql,除非配置查詢緩存,
但list默認(rèn)情況下不會(huì)利用緩存,而是每次發(fā)出sql
在默認(rèn)情況下,list會(huì)向緩存中放入數(shù)據(jù),但不會(huì)利用數(shù)據(jù)
List students=session.createQuery("from Student").list();

for(
.)
{
.}
7 list和iterate的區(qū)別
* list:在默認(rèn)情況下每次都會(huì)向數(shù)據(jù)庫發(fā)出sql,list會(huì)向緩存中放入數(shù)據(jù),但不會(huì)利用緩存中的數(shù)據(jù)
* iterate:在默認(rèn)情況下會(huì)利用緩存中的數(shù)據(jù),但緩存中不存在數(shù)據(jù),有可能出現(xiàn)N+1問題
條件查詢[重要]
* 方法鏈編程
Query query=session.createQuery("select id,name from Student where name like ?");
query.setParameter(0, "%1%");
List students =query.list();
//等效于:
List students=session.createQuery("select id,name from Student where name like ?")
.setParameter(0, "%1%")
.list();
1 拼字符串
可以采用拼字符串的方式組織查詢條件
List students=session.createQuery("select id,name from Student where name like '%1%'").list();
2 ?傳遞參數(shù)
可以采用?占位符來傳遞參數(shù),參數(shù)的索引從0開始,傳遞的參數(shù)值不用單引號(hào)引起來
List students=session.createQuery("select id,name from Student where name like ?")
.setParameter(0, "%1%")
.list();
3 “:參數(shù)名” 傳遞參數(shù)
可以采用“:參數(shù)名稱”的方式傳遞參數(shù),效果等同于?占位符方式
List students=session.createQuery("select id,name from Student where name like :myname")
.setParameter("myname", "%1%")
.list();
4 支持in,采用(:參數(shù)名)傳遞參數(shù)數(shù)組
支持in,使用“(:參數(shù)名稱)”的方式傳遞數(shù)組,用setParameterList()設(shè)置數(shù)組參數(shù)
List students=session.createQuery("select id,name from Student where id in (:myids)")

.setParameterList("myids", new Object[]
{1,2,3,4,5,6})
.list();
5 支持and和between
List students=session.createQuery("select id,name from Student where name like :myname and id=:myid")
.setParameter("myname", "%1%")
.setParameter("myid", 12)
.list();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List students=session.createQuery("select id,name from Student where createTime between ? and ?")
.setParameter(0, sdf.parse("2008-01-10 00:00:00"))
.setParameter(1, sdf.parse("2008-02-15 00:00:00"))
.list();
6 在hql中可以使用數(shù)據(jù)庫中的函數(shù)
不建議使用
List students=session.createQuery("select id,name from Student where date_format(createTime,'%Y-%m')=?")
.setParameter(0, "2008-02")
.list();
原生sql查詢
List students=session.createSQLQuery("select * from t_student).list();

for(Iterator iter=students.iterator();iter.hasNext();)
{
Object[] obj=(Object[])iter.next();
System.out.println(obj[0]+":"+obj[1]);
}
外置命名查詢
* 在映射文件中采用<query>標(biāo)簽來定義hql,可以在任何一個(gè)映射文件中,name屬性名能重復(fù)
<query name="searchStudents">
<![CDATA[
select s from Student s where s.id<?
]]>
</query>
* 在程序中采用session.getNameQuery()方法得到hql查詢串
List students=session.getNamedQuery("searchStudents")
.setParameter(0, 10)
.list();
查詢過濾器
* 在映射文件中定義過濾器參數(shù)
<filter-def name="filtertest">
<filter-param name="myid" type="integer"/>
</filter-def>
* 在類的映射中使用這些參數(shù)
<class name="com.my.hibernate.Student">
<filter name="filtertest" condition="id < :myid"/>
</class>
* 在程序中起用過濾器,傳入?yún)?shù)
session.enableFilter("filtertest").setParameter("myid", 10);
List students=session.createQuery("from Student").list();
分頁查詢[重要]
List students=session.createQuery("from Student")
.setFirstResult(0)
.setMaxResults(3)
.list();
//setFirstResult()從0開始
//setMaxResults()每頁顯示多少條數(shù)據(jù)
對(duì)象導(dǎo)航查詢,在hql中采用“.”進(jìn)行導(dǎo)航[重要]
List students=session.createQuery("select s.name from Student s where s.classes.name like '%1%'").list();
連接查詢[重要]
* 內(nèi)連接
List students=session.createQuery("select c.name,s.name from Student s join s.classes c")
.list();
// inner可以省略
List students=session.createQuery("select c.name,s.name from Student s inner join s.classes c")
.list();
* 外連接(左連接/右連接)
//左:
List students=session.createQuery("select c.name,s.name from Classes c left join c.students s").list();
//右:
List students=session.createQuery("select c.name,s.name from Classes c right join c.students s").list();
統(tǒng)計(jì)查詢[重要]
List stu=(List)session.createQuery("select count(*) from Student").list();
// uniqueResult()查詢單一值,返回Long類型
Long count=(Long)session.createQuery("select count(*) from Student").uniqueResult();
// 分組查詢問
List students=(List)session.createQuery("select c.name,count(s) from Student s join s.classes c group by c.name order by c.name").list();
DML風(fēng)格的查詢
批量修改、刪除、插入,可能會(huì)出現(xiàn)臟數(shù)據(jù),盡量少用,和緩存不同步
session.createQuery("update Student s set s.name=? where s.id<?")
.setParameter(0, "田田田")
.setParameter(1, 5)
.executeUpdate();
其他
is null, and, or, not, in, between
Restrictions.like("bookname","a",MatchMode.START);
關(guān)鍵字不區(qū)分大小寫,類名區(qū)分大小寫,類名不能用關(guān)鍵字,類名可以用全名
select s from Student s where s.name like '%李%'
select s from Student s where s.name like ?
query.setString(0,"%李%").list();
query.setEntity(classes);//對(duì)象實(shí)體參數(shù)
注意jdbc中perstmt參數(shù)從1開始
from Student s where s.id between :dd and :dr
query.setInt(dd,1);
query.setInt(dr,2);
select j from Tjd j,Tfw f where f.jd=j and fw.lxr='王先生'
select s from Strudent s,Classes c where s.classes=c //聯(lián)表查詢
分頁
query.setFirstResult(0);//默認(rèn)從0開始
query.setMaxResult(int size);
posted on 2009-11-03 17:14
junly 閱讀(501)
評(píng)論(0) 編輯 收藏 所屬分類:
hibernate/orm