Hibernate Query Language(HQL)。
生活随笔
收集整理的這篇文章主要介紹了
Hibernate Query Language(HQL)。
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Hibernate Query Language(HQL)提供了十分強大的功能,推薦大家使用這種查詢方式。HQL具有與SQL語言類似的語法規(guī)范,只不過SQL針對表中字段進行查詢,而HQL針對持久化對象,它用來取得對象,而不進行update、delete和insert等操作。而且HQL是完全面向對象的,具備繼承、多態(tài)和關聯(lián)等特性。
1.from子句
from字句是最簡單的HQL語句,例如 from Student,也可以寫成select s from Student s。它簡單地返回Student類的所有實例。
除了Java類和屬性的名稱外,HQL語句對大小寫并不敏感,所以在上一句HQL語句中,from與FROM是相同的,但是Student與student就不同了,所以上述語句寫成from student就會報錯。下列程序演示如何通過執(zhí)行from語句取得所有的Student對象。
Query query = session.createQuery(“from Student”);
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語句“from Student, Course”,并不簡單地返回兩個對象,而是返回這兩個對象的的笛卡兒積,這類似于SQL語句中字段的全外連接。在實際應用中,像“from Student, Course”這樣的語句幾乎不會出現(xiàn)。
2.select子句
有時并不需要得到對象的所有屬性,這時可以使用select子句進行屬性查詢,例如,select s.name from Student s。下面程序演示如何執(zhí)行這個語句:
Query query = session.createQuery(“select s.name from Student s”);
List list = query.list();
for (int i=0;i<list.size(); i++) {
String name = (String)list.get(i);
System.out.println(ame());
}
如果要查詢兩個以上的屬性,查詢結果會以數(shù)組的方式返回,如下所示:??Query query = session.createQuery(“select s.name, s.sex from Student as s”);
List list = query.list();
for (int i=0;i<list.size(); i++) {
Object obj[] = (Object[])list.get(i);
System.out.println(ame(obj[0] + “的性別是:” +obj[1]));
}
在使用屬性查詢時,由于使用對象數(shù)組,操作和理解都不太方便,如果將一個object[]中所有成員封裝成一個對象就方便多了。下面的程序將查詢結果進行了實例化:
Query query = session.createQuery(“select new Student(s.name, s.sex) from 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());
}
要正確運行以上程序,還需要在Student類中加入一個如下的構造函數(shù):
public Student(String name, String sex)
{
this.name = name;
this.sex = sex;
}
3.統(tǒng)計函數(shù)查詢
可以在HQL中使用函數(shù),經常使用的函數(shù)有:
count():統(tǒng)計記錄條數(shù)
min():求最小值
max():求最大值
sum():求和
age():求平均值
例如,要取得Student實例的數(shù)量,可以編寫如下HQL語句:
select count(*) from Student
取得Student的平均年齡的HQL語句如下:
select avg(s.age) from Student as s
可以使用distinct去除重復數(shù)據(jù):
select distinct s.age from Student as s
4.where子句
HQL也支持子查詢,它通過where子句實現(xiàn)這一機制。where子句讓用戶縮小要返回的實例的列表范圍,例如下面語句會返回所有名字為“Bill”的Student實例:
Query query = session.createQuery("from Student as s where s.name='Bill' ");
where子句允許出現(xiàn)的表達式包括了SQL中可以使用的大多數(shù)情況:
數(shù)學操作:+,-,*,/
真假比較操作:=,>=,<=,<>,!=,like
邏輯操作:and,or, not
字符串連接:||
SQL標量函數(shù):例如upper()和lower()
如果子查詢返回多條記錄,可以用以下的關鍵字來量化:
all:表示所有的記錄。
any:表示所有記錄中的任意一條。
some:與any用法相同。
in:與any等價。
exists:表示子查詢至少要返回一條記錄。
例如,下面語句返回所有學生的年齡都大于22的班級對象:
from Group g where 22<all (select s.age from g.students s)
下述語句返回在所有學生中有一個學生的年齡等于22的班級:
from Group g where 22=any (select s.age from g.students s)
或者
from Group g where 22=some (select s.age from g.students s)
或者
from Group g where 22 in (select s.age from g.students s)
5.order by 子句
查詢返回的列表可以按照任何返回的類或者組件的屬性排序:
from Student s order by s.name asc
asc和desc是可選的,分別代表升序或者降序。
6.連接查詢
與SQL查詢一樣, HQL也支持連接查詢,如內連接、外連接和交叉連接。
inner join: 內連接
left outer join:左外連接
right outer join:右外連接
full join: 全連接,但不常用
下面重點講解內連接查詢,左外連接和右外連接查詢和內連接大同小異,而全連接幾乎不怎么使用。
inner join可以簡寫為join,例如在查詢得到Group對象時,內連接取得對應的Student對象,實現(xiàn)的程序如下。
……//打開Session,開啟事務
Student??stu = null;??//聲明Student實例
Group??group = null; //聲明Group實例
Query query = session.createQuery("from Group g join g.students");
List list = query.list();
Object obj[] = null;??//聲明對象數(shù)組
for(int i=0;i<list.size();i++)??{
obj = (Object[])list.get(i); //取得集合中的第i個數(shù)組
group = (Group)obj[0];??//group是數(shù)組中第一個對象
stu = (Student)obj[1];?? //stu是數(shù)組中第二個對象
System.out.println(stu.getName() + "屬于:" +group.getName() );
}
……//提交事務,關閉Session
1.from子句
from字句是最簡單的HQL語句,例如 from Student,也可以寫成select s from Student s。它簡單地返回Student類的所有實例。
除了Java類和屬性的名稱外,HQL語句對大小寫并不敏感,所以在上一句HQL語句中,from與FROM是相同的,但是Student與student就不同了,所以上述語句寫成from student就會報錯。下列程序演示如何通過執(zhí)行from語句取得所有的Student對象。
Query query = session.createQuery(“from Student”);
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語句“from Student, Course”,并不簡單地返回兩個對象,而是返回這兩個對象的的笛卡兒積,這類似于SQL語句中字段的全外連接。在實際應用中,像“from Student, Course”這樣的語句幾乎不會出現(xiàn)。
2.select子句
有時并不需要得到對象的所有屬性,這時可以使用select子句進行屬性查詢,例如,select s.name from Student s。下面程序演示如何執(zhí)行這個語句:
Query query = session.createQuery(“select s.name from Student s”);
List list = query.list();
for (int i=0;i<list.size(); i++) {
String name = (String)list.get(i);
System.out.println(ame());
}
如果要查詢兩個以上的屬性,查詢結果會以數(shù)組的方式返回,如下所示:??Query query = session.createQuery(“select s.name, s.sex from Student as s”);
List list = query.list();
for (int i=0;i<list.size(); i++) {
Object obj[] = (Object[])list.get(i);
System.out.println(ame(obj[0] + “的性別是:” +obj[1]));
}
在使用屬性查詢時,由于使用對象數(shù)組,操作和理解都不太方便,如果將一個object[]中所有成員封裝成一個對象就方便多了。下面的程序將查詢結果進行了實例化:
Query query = session.createQuery(“select new Student(s.name, s.sex) from 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());
}
要正確運行以上程序,還需要在Student類中加入一個如下的構造函數(shù):
public Student(String name, String sex)
{
this.name = name;
this.sex = sex;
}
3.統(tǒng)計函數(shù)查詢
可以在HQL中使用函數(shù),經常使用的函數(shù)有:
count():統(tǒng)計記錄條數(shù)
min():求最小值
max():求最大值
sum():求和
age():求平均值
例如,要取得Student實例的數(shù)量,可以編寫如下HQL語句:
select count(*) from Student
取得Student的平均年齡的HQL語句如下:
select avg(s.age) from Student as s
可以使用distinct去除重復數(shù)據(jù):
select distinct s.age from Student as s
4.where子句
HQL也支持子查詢,它通過where子句實現(xiàn)這一機制。where子句讓用戶縮小要返回的實例的列表范圍,例如下面語句會返回所有名字為“Bill”的Student實例:
Query query = session.createQuery("from Student as s where s.name='Bill' ");
where子句允許出現(xiàn)的表達式包括了SQL中可以使用的大多數(shù)情況:
數(shù)學操作:+,-,*,/
真假比較操作:=,>=,<=,<>,!=,like
邏輯操作:and,or, not
字符串連接:||
SQL標量函數(shù):例如upper()和lower()
如果子查詢返回多條記錄,可以用以下的關鍵字來量化:
all:表示所有的記錄。
any:表示所有記錄中的任意一條。
some:與any用法相同。
in:與any等價。
exists:表示子查詢至少要返回一條記錄。
例如,下面語句返回所有學生的年齡都大于22的班級對象:
from Group g where 22<all (select s.age from g.students s)
下述語句返回在所有學生中有一個學生的年齡等于22的班級:
from Group g where 22=any (select s.age from g.students s)
或者
from Group g where 22=some (select s.age from g.students s)
或者
from Group g where 22 in (select s.age from g.students s)
5.order by 子句
查詢返回的列表可以按照任何返回的類或者組件的屬性排序:
from Student s order by s.name asc
asc和desc是可選的,分別代表升序或者降序。
6.連接查詢
與SQL查詢一樣, HQL也支持連接查詢,如內連接、外連接和交叉連接。
inner join: 內連接
left outer join:左外連接
right outer join:右外連接
full join: 全連接,但不常用
下面重點講解內連接查詢,左外連接和右外連接查詢和內連接大同小異,而全連接幾乎不怎么使用。
inner join可以簡寫為join,例如在查詢得到Group對象時,內連接取得對應的Student對象,實現(xiàn)的程序如下。
……//打開Session,開啟事務
Student??stu = null;??//聲明Student實例
Group??group = null; //聲明Group實例
Query query = session.createQuery("from Group g join g.students");
List list = query.list();
Object obj[] = null;??//聲明對象數(shù)組
for(int i=0;i<list.size();i++)??{
obj = (Object[])list.get(i); //取得集合中的第i個數(shù)組
group = (Group)obj[0];??//group是數(shù)組中第一個對象
stu = (Student)obj[1];?? //stu是數(shù)組中第二個對象
System.out.println(stu.getName() + "屬于:" +group.getName() );
}
……//提交事務,關閉Session
總結
以上是生活随笔為你收集整理的Hibernate Query Language(HQL)。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是相互保
- 下一篇: 同花顺peg指标在哪里看