HQL(Hibernate Query Language):是面向對象的查詢語句,它的語法和SQL語句有些相像,在運行時才得以解析.HQL并不像SQL那樣是數據操作語言,它用來取得對象,而不是進行update,delete和insert操作. HQL 是一門對大小寫不敏感的的語言,所以SeLect與SELECT和sELeCT是相同的.
----------------
現在有四張表:student,team,course,student_course.
student 表中有五個字段,分別是:id,name,cardId,age,team_id;
team 表中有兩個字段,id,teamname;
course 表中有id,name;
student_course 表中有stu_id,course_id; 保存多對多的關系表
----------------
Student 是一個對象,student 是數據庫中的一個表.
查詢所有的Student對象時,最簡單的HQL語句是: from Student,也可以寫成 select s from Student (as)s. 注:這的as可以省略
1:簡單的查詢遍歷對象:
遍歷Student
Query query=session.createQuery("form Student"); //注: 如果Student對象不是唯一的,那么需要寫上包名,如: 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());
}
注意: 如果執行HQL語句"from Student,Course",并不時單單返回兩個對象,而是返回兩個對象的笛卡爾積,這類似SQL語句中字段的全外連接.實際的應用中,"from Student,Course"這種語句幾乎是不回出現的.
2:屬性查詢:
----單個屬性查詢:
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);
}
----多個屬性查詢:
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個對象
System.out.println(obj[0]+"的年齡為: "+obj[1]);
}
3:實例化查詢:
實例化查詢結果可以說是對屬性查詢的一重改進.在使用屬性查詢時由于使用對象數組,操作和理解不太方便,如果將以個Object[]中的成員封裝成一個對象就方便多了.
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());
}
注:運行這個程序的時候,需要一個new Student(s.name,s.age)構造函數.在Student.java中編寫這個構造函數.
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
4:查詢鏈接:
與SQL查詢一樣,HQL也支持連接查詢,如內連接,外連接和交叉連接.支持的鏈接類型是從ANSI SQL中借鑒來的.
1: inner jion (內連接)
2: left outer join (左外連接)
3: right outer join(右外連接)
4: full join(全連接--不常用)
inner jion 可以簡寫為join.
正常情況下必須要建關聯。
select a.id, b.id from A a, B b where a.id = b.id;
上面每條記錄返回的是一個Object[]對象。
你也可以把結果重新封裝一下。
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);
//這里就可以重新封裝數據
}
}
5:統計函數查詢:
1: count() 統計記錄的條數
2: min() 求最小值
3: max() 求最大值
4: sum() 求和
4: avg() 求平均值
//取得Student的數量
Query query=session.createQuery("select count(*) from Student")
//avg()取得Student平均年齡
Query query=session.createQuery("select avg(s.age) from Student as s")
//upper()方法將字符串轉為大寫
Query query=session.createQuery("select upper(s.name) from Student as s")
//去除重復行distinct
Query query=session.createQuery("select distinct s.age from Student as s")
6:子查詢:
all 表示所有記錄
any 便是所有記錄中的任意一條
somy 與any用法一樣
in 等價于any
exists 表示子查詢至少要返回一條數據.
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"); //根據id 得到stu對象
stu.setName("123");
session.update(stu);
8:刪除:
delete()
Student stu=(Student)session.get(Student.class,"id"); //根據id 得到stu對象
session.delete(stu);