Hibernate HQL查詢語句Query
阿新 • • 發佈:2018-12-09
Department類
@Entity
@Table(name="t_department")
public class Department extends BaseEntity {
String name;
@OneToMany(mappedBy="department")
private Set<Employee> employees;
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees (Set<Employee> employees) {
this.employees = employees;
}
public Department() {
super();
// TODO Auto-generated constructor stub
}
public Department(String name) {
this.name = name;
}
public Department(int id, String name) {
super (id);
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Department [name=" + name + "]";
}
}
Employee 類
@Entity
@Table (name="t_employee")
public class Employee extends BaseEntity {
private String name;
private int age;
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="depart_id")
private Department department;
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public Employee() {
super();
// TODO Auto-generated constructor stub
}
public Employee(String name, int age) {
super();
this.name = name;
this.age = age;
}
/*public Employee(int id, String name, int age) {
super(id);
this.name = name;
this.age = age;
}*/
@Override
public String toString() {
return "Employee [id="+id+",name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
測試類
public class HQLDemo01 {
public static void main(String[] args) {
//add();
query();
}
/**
* 演示HQL的使用
*/
private static void query() {
Session session=HibernateUtils.getSession();
//1.查詢單個物件
/*String hql="from Employee where id=:id";
Query query=session.createQuery(hql);
query.setInteger("id",1);*/
//如果明確知道查詢的結果就一個物件,可以不使用集合操作。
/*List<Employee> employees=query.list();
System.out.println(employees);*/
//如果只查詢一個物件,可以使用query.uniqueResult()方法,此方法必須保證返回的物件只有一個,
//如果有多個則報異常:org.hibernate.NonUniqueResultException:
/*Employee employee=(Employee) query.uniqueResult();
System.out.println(employee);*/
/*//2.查詢多個物件
String hql="from Employee";
Query query=session.createQuery(hql);
List<Employee> employees=query.list();
System.out.println(employees);*/
/*
* 3.分頁查詢
*
* 已知變數:
* 當前頁號pageNo=1;
* 每頁顯示的記錄數pageSize=3;
* 起始索引=(pageNo-1)*pageSize
* 結束索引=pageNo*pageSize
*/
/*String hql="from Employee";
Query query=session.createQuery(hql);
int pageNo=2;
int pageSize=4;
int startIndex=(pageNo-1)*pageSize;
//設定起始索引
query.setFirstResult(startIndex);
//設定每頁顯示的記錄數
query.setMaxResults(pageSize);
List<Employee> employees=query.list();
System.out.println(employees);*/
//4.對查詢的資料進行排序 order by 欄位名 asc|desc
//String hql="from Employee order by id desc";
//String hql="from Employee order by id asc";
/*String hql="from Employee order by id";//如果不指定,則預設是升序排序,即asc可以省略
Query query=session.createQuery(hql);
List<Employee> employees=query.list();
System.out.println(employees);*/
//5.對查詢的資料進行分組
/*String hql="select e.age,count(*) from Employee e group by age having count(*)>2";//如果不指定,則預設是升序排序,即asc可以省略
Query query=session.createQuery(hql);
List<Object[]> employees=query.list();
for(Object[] objs :employees){
System.out.println(Arrays.toString(objs));
}*/
//6.聚合函式:count(*),sum(欄位),avg(欄位名),max(欄位),min(欄位)
/*String hql="select count(*) from Employee";
Query query=session.createQuery(hql);
long count=(long) query.uniqueResult();
System.out.println("count="+count);*/
/*String hql="select sum(age) from Employee";
Query query=session.createQuery(hql);
long sum=(long) query.uniqueResult();
System.out.println("sum="+sum);*/
/*String hql="select avg(age) from Employee";
Query query=session.createQuery(hql);
double avg=(double) query.uniqueResult();
System.out.println("avg="+avg);*/
/*String hql="select max(age) from Employee";
Query query=session.createQuery(hql);
int max=(int) query.uniqueResult();
System.out.println("max="+max);*/
/*String hql="select min(age) from Employee";
Query query=session.createQuery(hql);
int min=(int) query.uniqueResult();
System.out.println("min="+min);*/
/*String hql="select avg(age) from Employee";
Query query=session.createQuery(hql);
Object obj=(Object) query.uniqueResult();
System.out.println("obj="+obj);*/
/*//7.查詢單個屬性
String hql="select name from Employee";
Query query=session.createQuery(hql);
List<Object> list=query.list();
System.out.println("list="+list);*/
//8.查詢多個屬性
//A:使用物件陣列接收查詢到的資料
/*String hql="select id,name,age from Employee";
Query query=session.createQuery(hql);
List<Object[]> list=query.list();
for(Object[] objs:list){
System.out.println("objs="+Arrays.toString(objs));
}
*/
//B:使用List集合接收多個屬性的值
/*String hql="select new List(id,name,age) from Employee";
Query query=session.createQuery(hql);
List<List<Object>> list=query.list();
for(List<Object> objs:list){
System.out.println(objs);
}*/
//C:使用Map接收多個屬性的值,此時建議一定要給查詢的列起別名,否則鍵就是從0開始依次遞增的數字作為key
/*String hql="select new Map(id as id,name as name,age as age) from Employee";
Query query=session.createQuery(hql);
List<Map<String,Object>> list=query.list();
for(Map<String,Object> objs:list){
System.out.println(objs);
}*/
//D:使用物件接收
//String hql="select new Employee(id,name,age) from Employee";
//String hql="select e from Employee e";
/*String hql="select new Employee(name,age) from Employee";
Query query=session.createQuery(hql);
List<Employee> list=query.list();
for(Employee e:list){
System.out.println(e);
}*/
//9.關聯查詢
//String hql="select e.name,d.name from Employee e inner join Department d";//錯誤寫法
/*String hql="select e.name,d.name from Employee e inner join e.department d";//正確寫法
Query query=session.createQuery(hql);
List<Object[]> list=query.list();
for(Object[] objs:list){
System.out.println(Arrays.toString(objs));
}*/
//String hql="select new Map(e.name as empName,d.name as deptName) from Employee e inner join e.department d";//正確寫法
//String hql="select new Map(e.name as empName,d.name as deptName) from Employee e left join e.department d";//正確寫法
/*String hql="select new Map(e.name as empName,d.name as deptName) from Employee e right join e.department d";//正確寫法
//String hql="select new Map(e.name as empName,d.name as deptName) from Employee e full join e.department d";//mysql5.x不支援全連線
Query query=session.createQuery(hql);
List<Map<String,Object>> list=query.list();
for(Map<String,Object> map:list){
System.out.println(map);
}*/
System.out.println("=======================");
//使用hql做增刪改操作必須顯示啟動事務和提交事務,否則操作失敗
//A:做插入操作,需要注意:目前hql不支援insert into 表(欄位列表) values (值列表)
/*String hql="insert into Employee values(null,?,?)";
Query query=session.createQuery(hql);
query.setString(0,"小夢");
query.setInteger(1,18);*/
//類上sql:insert into t_employee(name,age,depart_id) select name,age,depart_id from t_employee;
//B:但hql支援insert into .... select 形式的插入
/*Transaction transaction=session.beginTransaction();
String hql="insert into Employee(name,age) select name,age from Employee";
Query query=session.createQuery(hql);
//返回受影響的行數
int count=query.executeUpdate();
System.out.println("count="+count);
transaction.commit();
*/
//C:修改操作
/*Transaction transaction=session.beginTransaction();
String hql="update Employee set name=:name,age=:age where id=:id";
Query query=session.createQuery(hql);
query.setString("name","小龍女");
query.setInteger("age", 24);
query.setInteger("id", 55);
//返回受影響的行數
int count=query.executeUpdate();
System.out.println("count="+count);
transaction.commit();*/
//D:刪除操作
Transaction transaction=session.beginTransaction();
String hql="delete from Employee where id in (52,53,54,55)";
Query query=session.createQuery(hql);
//返回受影響的行數
int count=query.executeUpdate();
System.out.println("count="+count);
transaction.commit();
}
private static void add() {
Session session=HibernateUtils.getSession();
try{
Transaction transaction=session.beginTransaction();
Employee e1=new Employee("小麗", 20);
Department d1=new Department("教學部");
e1.setDepartment(d1);
session.persist(e1);
Employee e2=new Employee("小龍", 20);
e2.setDepartment(d1);
session.persist(e2);
Employee e3=new Employee("趙麗穎", 18);
Department d2=new Department("影視部");
e3.setDepartment(d2);
session.persist(e3);
Employee e4=new Employee("宇文玥", 18);
e4.setDepartment(d2);
session.persist(e4);
Employee e5=new Employee("宇文壞", 18);
session.persist(e5);
Employee e6=new Employee(null, 18);
session.persist(e6);
Department d3=new Department("市場部");
session.persist(d3);
Department d4=new Department(null);
session.persist(d4);
transaction.commit();
}finally{
HibernateUtils.close(session);
}
}
}
以下只有查詢語句而無實體類
/*//1.查詢所有
String hql="from Student";
Query query=session.createQuery(hql);
List<Student> students=query.list();
System.out.println(students);*/
//2.根據where條件查詢
/*String hql="from Student where name like ? and age>?";
Query query=session.createQuery(hql);
String condition="曉";
query.setString(0, "%"+condition+"%");
query.setInteger(1, 20);
List<Student> students=query.list();
System.out.println(students);*/
//3.查詢所有實體
//String hql="from com.hsj.domain.BaseEntity";
/*String hql="select id from com.hsj.domain.BaseEntity";
Query query=session.createQuery(hql);
List<Object> ids=query.list();
System.out.println(ids);*/
/*String hql="select id,name from com.hsj.domain.BaseEntity";
Query query=session.createQuery(hql);
List<Object[]> list=query.list();
for(Object[] objs:list){
System.out.println(Arrays.toString(objs));
}*/
//當前資料庫中所有註冊過的實體物件對應的資料
String hql="from java.lang.Object";
Query query=session.createQuery(hql);
List<Object> list=query.list();
for(Object obj:list){
System.out.println(obj);
}
//使用as 和where 關鍵字
//String hql="select s from Student as s where s.name like '%曉%'";
//String hql="select s from Student as s where s.name ='童薇學生'";
//String hql="select s from Student as s where s.name !='童薇學生'";
//String hql="select s from Student as s where s.name <>'童薇學生'";
//String hql="select s from Student as s where s.age >22";
//String hql="select s from Student as s where s.age <22";
//between min and max:包括min和max的
//String hql="select s from Student as s where s.age between 22 and 25";
//String hql="select s from Student as s where s.age not between 22 and 25";
//String hql="select s from Student as s where s.age in (20,22)";
//String hql="select s from Student as s where s.age not in (20,22)";
//String hql="select s from Student as s where s.email = null";//hql特有的寫法,sql中這樣寫錯誤
//String hql="select s from Student as s where s.email is null";//正確的寫法
//String hql="select s from Student as s where s.email != null";//hql特有的寫法,sql中這樣寫錯誤
//String hql="select s from Student as s where s.email <> null";//hql特有的寫法,sql中這樣寫錯誤
//is not null是判斷不為null的,但沒有not is null的寫法。
//String hql="select s from Student as s where s.email not is null";//錯誤的寫法
String hql="select s from Student as s where s.email is not null";//正確的寫法
Query query=session.createQuery(hql);
List<Student> list=query.list();
for(Student stu:list){
System.out.println(stu);
}
/*String hql="select new Student(name,sex,age,email) from Student";
Query query=session.createQuery(hql);
List<Student> students= query.list();
for(Student student:students){
System.out.println(student);
}*/
/*//String hql="select upper(email) from Student";
//String hql="select lower(upper(email)) from Student";
//String hql="select lower(upper(email)) from Student";
String hql="select distinct email from Student";
Query query=session.createQuery(hql);
List<Object> list= query.list();
for(Object obj:list){
System.out.println(obj);
}*/
/*String hql="select new List(name,age,sex) from Student";
Query query=session.createQuery(hql);
List<List<Object>> list= query.list();
for(List<Object> obj:list){
System.out.println(obj);
}*/
/*//使用Map時必須給查詢的列起別名,如果不起別名則使用索引值從0開始作為鍵,但如果其別名必須是as關鍵字
String hql="select new Map(name as 姓名,age as 年齡,sex as 性別) from Student";
Query query=session.createQuery(hql);
List<Map<String,Object>> list= query.list();
for(Map<String,Object> map:list){
System.out.println(map);
}*/
/*//做增刪改操作必須啟動事務並提交,否則無效 Transaction transaction=session.beginTransaction(); //hql語句不支援insert …. value…形式的語句,但支援insert into …. select ….. //String hql=”insert into Student(id,name,sex,age,email) values (null,’玲玲’,’女’,20,’[email protected]’,1)”;
//insert into 表名(欄位列表) select 欄位列表 from 表名 where 條件
//String hql="insert into Student(name,sex,age,email) select name,sex,age,email from Student";
Query query=session.createQuery(hql);
//返回本次操作受影響的行數
int count=query.executeUpdate();
System.out.println("count="+count);
transaction.commit();*/