菜鳥先飛之HQL語句的運用
阿新 • • 發佈:2018-12-21
HQL語句
概述
HQL是Hibernate Query Language的縮寫,提供更加豐富靈活、更為強大的查詢能力;HQL更接近SQL語句查詢語法。
用法
使用經典的的資料庫表關係模型學生選課:student(學生表)、course(課表)、sc(成績表)
1) FROM子句的使用
from子句的查詢可以使用全限定名進行查詢,也可以使用別名進行查詢。
2) 限定FROM子句的返回值/** * @Title: testFrom * @Description: from子句的使用 * @throws */ @Test public void testFrom() { // 使用全限定名查詢 // String hql = "from demo.hql.domain.Student"; // 查詢主體必須和持久化類保持一致 // String hql = "from Student"; // 使用別名,方便hql語句的其他部分通過別名引用該類 // String hql = "from Student as s"; // 使用別名可以不使用as關鍵字 String hql = "from Student s"; Query query = session.createQuery(hql); List<Student> students = query.list(); for (Student student : students) { System.out.println(student); } }
以Object[]形式返回選擇的屬性
以List形式返回選擇的屬性/** * @Title: testSelectObjectArray * @Description: 以Object[]形式返回選擇的屬性 * @throws */ @Test public void testSelectObjectArray() { String hql = "select s.sname,s.ssex from Student s"; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for (Object[] objects : list) { System.out.println("name:" + objects[0] + "age:" + objects[1]); } // 如果返回的結果只有一個的話,就不能用Object[]來接收,否則會報錯 /*String hql = "select s.sname from Student s"; Query query = session.createQuery(hql); List<Object> list = query.list(); for (Object object : list) { System.out.println("name:" + object); }*/ }
以map的形式返回結果/** * @Title: testSelectList * @Description: 以List形式返回選擇的屬性 * @throws */ @Test public void testSelectList() { String hql = "select new list(s.sname,s.ssex,s.sage) from Student s"; Query query = session.createQuery(hql); List<List> lists = query.list(); for (List list : lists) { System.out.println("name:" + list.get(0) + " sex:" + list.get(1) + " age:" + list.get(2)); } }
/**
* @Title: testSelectMap
* @Description: 以map的形式返回結果
* @throws
*/
@Test
public void testSelectMap() {
String hql = "select new map(s.sname,s.ssex,s.sage) from Student s";
Query query = session.createQuery(hql);
List<Map> maps = query.list();
// 返回結果的 key 就是查詢的順序 value 就是返回的結果
for (Map map : maps) {
System.out.println("name:" + map.get("0") + " sex:" + map.get("1") + " age:" + map.get("2"));
}
}
以自定義型別返回結果
/**
* @Title: testSelectCustomType
* @Description: 以自定義型別返回結果
* @throws
*/
@Test
public void testSelectCustomType() {
// 自定義類中必須有相應的構造方法
String hql = "select new Student(s.sname,s.ssex,s.sclass) from Student s";
Query query = session.createQuery(hql);
List<Student> students = query.list();
for (Student student : students) {
System.out.println("name:" + student.getSname() + " sex:" + student.getSsex() + " class:" + student.getSclass());
}
}
distinct關鍵字去除重複元素
/**
* @Title: testSelectDistinct
* @Description: 使用distinct關鍵字去除重複元素
* @throws
*/
@Test
public void testSelectDistinct() {
String hql = "select distinct s.sclass from Student s";
Query query = session.createQuery(hql);
List<Object> objects = query.list();
for (Object object : objects) {
System.out.println(object);
}
}
3) WHERE子句
where子句中有比較運算、範圍運算、字串匹配運算、邏輯運算、集合運算、四則運算
/**
* @Title: testWhere
* @Description: where子句
* @throws
*/
@Test
public void testWhere() {
/*
* 比較運算
* 運算子 = <> < > >= <=
* null 值判斷 is null/is not null
*/
// String hql = "from Student s where s.sage > 20";
// String hql = "from Student s where s.sclass <> null";
/*
* 範圍運算
* in / not in (候選值列表)
* between / not between 值1 and 值2
*/
// String hql = "from Student s where s.sage in (20,25)";
// String hql = "from Student s where s.sage not between 20 and 25";
/*
* 字串模式匹配
* like關鍵字
* 萬用字元 %:匹配任意個字元 _:匹配一個字元
*/
// String hql = "from Student s where s.sname like '_二'";
// String hql = "from Student s where s.sname like '_二%'";
/*
* 邏輯運算
* and or not
*/
// String hql = "from Student s where s.sname like '_二' or s.sage = 20";
/*
* 集合運算
* is empty / is not empty 集合為空/不為空 empty ——> exists
* member of 元素屬於集合 member of ——> in
*/
// String hql = "from Student s where s.scs is empty";
/*
* 四則運算
* + - * /
*/
String hql = "from Student s where s.sage + 2 > 21";
Query query = session.createQuery(hql);
List<Student> students = query.list();
for (Student student : students) {
System.out.println(student);
}
}
4)ORDER BY 對查詢結果進行排序
/**
* @Title: testOrderBy
* @Description: order by 子句對查詢結果進行排序
* @throws
*/
@Test
public void testOrderBy() {
// String hql = "from Student s order by s.sage";
String hql = "from Student s order by s.sage asc , s.sid desc";
Query query = session.createQuery(hql);
List<Student> students = query.list();
for (Student student : students) {
System.out.println(student);
}
}
5) uniqueResult方法查詢單個物件
/**
* @Title: testUniqueResult
* @Description: uniqueResult方法查詢單個物件,如果有多個結果會報錯
* @throws
*/
@Test
public void testUniqueResult() {
String hql = "from Student s where s.sid = 1";
Query query = session.createQuery(hql);
Student student = (Student) query.uniqueResult();
System.out.println(student);
}