日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

HQL語(yǔ)句(結(jié)合實(shí)例)

 WindySky 2007-10-10

HQL(Hibernate Query Language):是面向?qū)ο蟮牟樵冋Z(yǔ)句,它的語(yǔ)法和SQL語(yǔ)句有些相像,在運(yùn)行時(shí)才得以解析.HQL并不像SQL那樣是數(shù)據(jù)操作語(yǔ)言,它用來(lái)取得對(duì)象,而不是進(jìn)行update,delete和insert操作. HQL 是一門對(duì)大小寫不敏感的的語(yǔ)言,所以SeLect與SELECT和sELeCT是相同的.


----------------
現(xiàn)在有四張表:student,team,course,student_course.

student 表中有五個(gè)字段,分別是:id,name,cardId,age,team_id;   
team      表中有兩個(gè)字段,id,teamname;
course 表中有id,name;
student_course 表中有stu_id,course_id;      保存多對(duì)多的關(guān)系表
----------------

Student 是一個(gè)對(duì)象,student 是數(shù)據(jù)庫(kù)中的一個(gè)表.

查詢所有的Student對(duì)象時(shí),最簡(jiǎn)單的HQL語(yǔ)句是: from Student,也可以寫成 select s from Student (as)s. 注:這的as可以省略

 


1:簡(jiǎn)單的查詢遍歷對(duì)象:

遍歷Student

Query query=session.createQuery("form Student");       //注: 如果Student對(duì)象不是唯一的,那么需要寫上包名,如: from test.Student      test為包名.
List list=query.list();
for(int i=0;i<list.size();i++)
{
Student stu=(Student)list.get(i);
System.out.println(stu.getName());
}

注意: 如果執(zhí)行HQL語(yǔ)句"from Student,Course",并不時(shí)單單返回兩個(gè)對(duì)象,而是返回兩個(gè)對(duì)象的笛卡爾積,這類似SQL語(yǔ)句中字段的全外連接.實(shí)際的應(yīng)用中,"from Student,Course"這種語(yǔ)句幾乎是不回出現(xiàn)的.


2:屬性查詢:

      ----單個(gè)屬性查詢:

Query query=session.createQuery("select s.name form Student s");
List list=query.list();
for(int i=0;i<list.size();i++)
{
String name=(String)list.get(i);
System.out.println(name);
}

      ----多個(gè)屬性查詢:

Query query=session.createQuery("select s.name,s.age form Student s");
List list=query.list();
for(int i=0;i<list.size();i++)
{
Object obj[]=(Object[])list.get(i);       //取得list中的第i個(gè)對(duì)象
System.out.println(obj[0]+"的年齡為: "+obj[1]);
}


3:實(shí)例化查詢:

實(shí)例化查詢結(jié)果可以說(shuō)是對(duì)屬性查詢的一重改進(jìn).在使用屬性查詢時(shí)由于使用對(duì)象數(shù)組,操作和理解不太方便,如果將以個(gè)Object[]中的成員封裝成一個(gè)對(duì)象就方便多了.

Query query=session.createQuery("select new Student(s.name,s.age) form Student s");
List list=query.list();
for(int i=0;i<list.size();i++)
{
Student stu=(Student)list.get(i);
System.out.println(stu.getName());
}

注:運(yùn)行這個(gè)程序的時(shí)候,需要一個(gè)new Student(s.name,s.age)構(gòu)造函數(shù).在Student.java中編寫這個(gè)構(gòu)造函數(shù).
public Student(String name,int age)
{
this.name=name;
this.age=age;
}

 

4:查詢鏈接:

與SQL查詢一樣,HQL也支持連接查詢,如內(nèi)連接,外連接和交叉連接.支持的鏈接類型是從ANSI SQL中借鑒來(lái)的.

      1: inner jion      (內(nèi)連接)
2: left outer join (左外連接)
3: right outer join(右外連接)
4: full join(全連接--不常用)

inner jion 可以簡(jiǎn)寫為join.

正常情況下必須要建關(guān)聯(lián)。


select a.id, b.id from A a, B b where a.id = b.id;
上面每條記錄返回的是一個(gè)Object[]對(duì)象。
你也可以把結(jié)果重新封裝一下。
String hql = "select a.id, b.id from A a, B b where a.id = b.id";
List result = getHibernateTemplate().find(hql);
if (result.size() > 0) {
for (int i = 0; i < result.size(); i++){
Object[] obj = (Object[]) result.get(i);
//這里就可以重新封裝數(shù)據(jù)
}
}


5:統(tǒng)計(jì)函數(shù)查詢:

1: count()       統(tǒng)計(jì)記錄的條數(shù)
2: min() 求最小值
3: max() 求最大值
4: sum() 求和
4: avg() 求平均值

//取得Student的數(shù)量
Query query=session.createQuery("select count(*) from Student")  

//avg()取得Student平均年齡
Query query=session.createQuery("select avg(s.age) from Student as s")  

//upper()方法將字符串轉(zhuǎn)為大寫
Query query=session.createQuery("select upper(s.name) from Student as s")  

//去除重復(fù)行distinct
Query query=session.createQuery("select distinct s.age from Student as s")  

 


6:子查詢:
all 表示所有記錄
any 便是所有記錄中的任意一條
somy 與any用法一樣
in 等價(jià)于any
exists 表示子查詢至少要返回一條數(shù)據(jù).


all:

from Team t where 22<all(select s.age from Student s)

from Team t where all(select s.age from      t.student s)>22

 


7:修改

update()

Student stu=(Student)session.get(Student.class,"id");      //根據(jù)id 得到stu對(duì)象
stu.setName("123");
session.update(stu);


8:刪除:

 

delete()

Student stu=(Student)session.get(Student.class,"id");      //根據(jù)id 得到stu對(duì)象
session.delete(stu);

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多