1. 程式人生 > >Hibernate HQL查詢語句Query

Hibernate HQL查詢語句Query

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();*/