Hibernate(六)

三套查询之HQL查询

hql语句(面向):类   对象   属性

 1 package com.rong.entity.hql;
 2 
 3 public class User {
 4     
 5     public User(int id, String name) {
 6         super();
 7         this.id = id;
 8         this.name = name;
 9     }
10     public User() {
11         super();
12     }
13     private int id;
14     private String name;
15     public int getId() {
16         return id;
17     }
18     public void setId(int id) {
19         this.id = id;
20     }
21     public String getName() {
22         return name;
23     }
24     public void setName(String name) {
25         this.name = name;
26     }
27 }
 1 package com.rong.entity.hql;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.GeneratedValue;
 5 import javax.persistence.GenerationType;
 6 import javax.persistence.Id;
 7 
 8 @Entity
 9 public class Student {
10     @Id
11     @GeneratedValue(strategy=GenerationType.AUTO)
12     private int id;
13     private String name;
14     private int age;
15     public int getId() {
16         return id;
17     }
18     public void setId(int id) {
19         this.id = id;
20     }
21     public String getName() {
22         return name;
23     }
24     public void setName(String name) {
25         this.name = name;
26     }
27     public int getAge() {
28         return age;
29     }
30     public void setAge(int age) {
31         this.age = age;
32     }
33 }
  1 package com.rong.entity.hql;
  2 
  3 import java.util.Iterator;
  4 import java.util.List;
  5 import java.util.Map;
  6 import java.util.Map.Entry;
  7 import java.util.Set;
  8 
  9 import org.hibernate.Query;
 10 import org.hibernate.Session;
 11 import org.hibernate.SessionFactory;
 12 import org.hibernate.Transaction;
 13 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 14 import org.hibernate.cfg.Configuration;
 15 import org.hibernate.service.ServiceRegistry;
 16 import org.junit.After;
 17 import org.junit.Before;
 18 import org.junit.Test;
 19 //hql语句(面向):类   对象   属性
 20 public class TestHQL {
 21     SessionFactory sessionFactory;
 22     Session session;
 23     Transaction transaction;
 24     @Before
 25     public void init() {
 26         Configuration configuration = new Configuration().configure();
 27         ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
 28                         .applySettings(configuration.getProperties()).build();
 29         sessionFactory=configuration.buildSessionFactory(serviceRegistry);
 30         session = sessionFactory.openSession();
 31         transaction = session.beginTransaction();
 32         
 33     }
 34     //插入数据
 35     @Test
 36     public void addData(){
 37         Student student=null;
 38         for(int i=1;i<=100;i++){
 39             student=new Student();
 40             student.setAge(i);
 41             student.setName("先生"+i);
 42             session.save(student);
 43         }
 44     }
 45     //查询所有的学生 (所有列)
 46     @Test
 47     public void test1(){
 48         Query query = session.createQuery("from Student");//Student是类名
 49         List<Student> list = query.list();
 50         System.out.println(list.size());
 51         for (Student student : list) {
 52             System.out.println(student.getAge()+student.getName());
 53         }
 54     }
 55     //查询所有的学生当中的某一列
 56     @Test
 57     public void test2(){
 58         //Student是类名,name是Student类的成员变量名
 59         Query query = session.createQuery("select s.name from Student s");
 60         List<Student> list = query.list();
 61         System.out.println(list);
 62     }
 63     //查询所有学生中的多列
 64     @Test
 65     public void test3(){
 66         Query query = session.createQuery("select s.name,s.age from Student s");
 67         //Query query = session.createQuery("select name,age from Student s");
 68         List<Object[]> list = query.list();
 69         //list集合的每一个元素都是数组,而每一个数组都是由name和age构成
 70         for (Object[] objects : list) {
 71             for (Object object : objects) {
 72                 System.out.print(object);
 73             }
 74             System.out.println();
 75         }
 76     }
 77     //分页查询
 78     @Test
 79     public void test4(){
 80         //Query query = session.createQuery("select s from Student s");
 81         Query query = session.createQuery("from Student");
 82         query.setFirstResult(0);//设置从哪里开始
 83         query.setMaxResults(3);//分页的条目
 84         List<Student> list = query.list();
 85         for (Student student : list) {
 86             System.out.println(student.getAge()+student.getName());
 87         }
 88     }
 89     //查询所有的学生的某些字段 返回值是map类型,即获取List<Map<String,Object>>结果
 90     @Test
 91     public void test5(){
 92         //这个是没有别名的
 93         //Query query = session.createQuery("select new map(s.name,s.age) from Student s");
 94         //这个有别名的(修改key的值 就需要增加别名)
 95         Query query = session.createQuery("select new map(s.name as name,s.age as age) from Student s");
 96         List<Map<String,Object>> list = query.list();
 97         //结果 key是 从0 开始的
 98         //System.out.println(list);//[{0=先生1, 1=1}, {0=先生2, 1=2}, {0=先生3, 1=3}......]
 99         System.out.println(list);//[{name=先生1, age=1}, {name=先生2, age=2}......]
100         for (Map<String, Object> map : list) {
101             Set<Entry<String, Object>> set = map.entrySet();
102             Iterator<Entry<String, Object>> iterator = set.iterator();
103             while(iterator.hasNext()){
104                 Entry<String, Object> entry = iterator.next();
105                 System.out.println(entry.getKey()+entry.getValue());
106             }
107         }
108     }
109     //查询所有的学生的某些字段,返回值是list类型,即获取List<List<Object>>结果
110     @Test
111     public void test6(){
112         Query query = session.createQuery("select new list(s.name,s.age) from Student s");
113         List<List<Object>> list = query.list();
114         for (List<Object> li : list) {
115             for (Object object : li) {
116                 System.out.print(object);
117             }
118             System.out.println();
119         }
120     }
121     //查询student表,返回值是User,User类必须要有public User(int id, String name)的构造方法!!!
122     @Test
123     public void test7(){
124         Query query = session.createQuery("select new com.rong.entity.hql.User(s.id,s.name) from Student s");
125         List<User> list = query.list();
126         for (User user : list) {
127             System.out.println(user.getId()+user.getName());
128         }
129     }
130     
131     
132     @After
133     public void destroy(){
134         transaction.commit();
135         session.close();
136         sessionFactory.close();
137     }
138 }

关联(持久化类)与连接(数据库表)

 1 package com.rong.entity.myhql;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.FetchType;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.GenerationType;
 7 import javax.persistence.Id;
 8 import javax.persistence.OneToOne;
 9 
10 @Entity
11 public class Teacher {
12     @Id
13     @GeneratedValue(strategy=GenerationType.AUTO)
14     private int tid;
15     private String tname;
16     @OneToOne(targetEntity=Student.class,fetch=FetchType.LAZY,mappedBy="teacher")
17     private Student student;
18     public int getTid() {
19         return tid;
20     }
21     public void setTid(int tid) {
22         this.tid = tid;
23     }
24     public String getTname() {
25         return tname;
26     }
27     public void setTname(String tname) {
28         this.tname = tname;
29     }
30 }
 1 package com.rong.entity.myhql;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.FetchType;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.GenerationType;
 7 import javax.persistence.Id;
 8 import javax.persistence.JoinColumn;
 9 import javax.persistence.OneToOne;
10 
11 @Entity
12 public class Student {
13     @Id
14     @GeneratedValue(strategy=GenerationType.AUTO)
15     private int id;
16     private String name;
17     private int age;
18     @OneToOne(targetEntity=Teacher.class,fetch=FetchType.LAZY)
19     @JoinColumn(name="t_id",referencedColumnName="tid",unique=true)
20     private Teacher teacher;
21     public int getId() {
22         return id;
23     }
24     public void setId(int id) {
25         this.id = id;
26     }
27     public String getName() {
28         return name;
29     }
30     public void setName(String name) {
31         this.name = name;
32     }
33     public int getAge() {
34         return age;
35     }
36     public void setAge(int age) {
37         this.age = age;
38     }
39     public Teacher getTeacher() {
40         return teacher;
41     }
42     public void setTeacher(Teacher teacher) {
43         this.teacher = teacher;
44     }
45 }
  1 package com.rong.entity.myhql;
  2 
  3 import java.util.List;
  4 
  5 import org.hibernate.Query;
  6 import org.hibernate.Session;
  7 import org.hibernate.SessionFactory;
  8 import org.hibernate.Transaction;
  9 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 10 import org.hibernate.cfg.Configuration;
 11 import org.hibernate.service.ServiceRegistry;
 12 import org.junit.After;
 13 import org.junit.Before;
 14 import org.junit.Test;
 15 //hql语句(面向):类   对象   属性
 16 public class TestHQL {
 17     SessionFactory sessionFactory;
 18     Session session;
 19     Transaction transaction;
 20     @Before
 21     public void init() {
 22         Configuration configuration = new Configuration().configure();
 23         ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
 24                         .applySettings(configuration.getProperties()).build();
 25         sessionFactory=configuration.buildSessionFactory(serviceRegistry);
 26         session = sessionFactory.openSession();
 27         transaction = session.beginTransaction();
 28         
 29     }
 30     //插入数据
 31     @Test
 32     public void addData(){
 33         Student student=null;
 34         Teacher teacher=null;
 35         for(int i=1;i<=20;i++){
 36             teacher=new Teacher();
 37             teacher.setTname("老师"+i);
 38             student=new Student();
 39             student.setAge(i);
 40             student.setName("学生"+i);
 41             student.setTeacher(teacher);
 42             session.save(teacher);
 43             session.save(student);
 44         }
 45     }
 46     //1.隐式关联(不需要写join语句)
 47     //查询时,关联的属性是一个持久化类. @ManyToOne、@OneToOne
 48     @Test
 49     public void test1(){
 50         Query query = session.createQuery("select s from Student s where s.teacher.tid=?");
 51         query.setParameter(0, 3);
 52         List<Student> list = query.list();
 53         for(int i=0;i<list.size();i++){
 54             Student student = list.get(i);
 55             //3学生333老师3
 56             System.out.println(student.getId()+student.getName()+student.getAge()
 57                                 +student.getTeacher().getTid()+student.getTeacher().getTname());
 58         }
 59         
 60     }
 61     //2.显示关联(需要写join语句)
 62     //注意:若使用@OneToMany、@ManyToMany查询时,关联的属性是一个Set集合. 这里使用@OneToOne
 63     @Test
 64     public void test2(){
 65         //注意: inner join 后边的类 要写 属性 inner join s.teacher
 66         Query query = session.createQuery("select s from Student s inner join s.teacher t where t.tid=?");
 67         query.setParameter(0, 18);
 68         Object uniqueResult = query.uniqueResult();
 69         Student student=(Student)uniqueResult;
 70         //18学生1818老师18
 71         System.out.println(student.getId()+student.getName()+student.getAge()
 72                             +student.getTeacher().getTname());
 73     }
 74     //3.抓取连接(查询延迟的属性)
 75     //查询时,关联的属性配置了延迟加载的,但本次查询要查询出来.join fetch 关联的属性
 76     @Test
 77     public void test3(){
 78         //查两次,要配置延迟加载
 79         //这里肯定是把Student查出来了。但是Student中的teacher属性还没有查数据库
 80         //因为Student的teacher属性配置了懒加载fetch=FetchType.LAZY
 81         Query query = session.createQuery("select s from Student s");
 82         List<Student> list = query.list();
 83         Student student = list.get(0);
 84         //要真正使用Teacher了。所以要去查数据库。
 85         System.out.println(student.getTeacher().getTname());
 86         
 87         System.out.println("=======================================");
 88         //查一次,要配置延迟加载
 89         //就是teacher属性虽然是懒加载的,但是我们通过join fetch直接把懒加载的属性全部查出来
 90         Query query2 = session.createQuery("select s from Student s join fetch s.teacher");
 91         List<Student> list2 = query2.list();
 92         Student student2 = list.get(0);
 93         System.out.println(student2.getTeacher().getTname());//这里不会再发sql了。
 94     }
 95     @After
 96     public void destroy(){
 97         transaction.commit();
 98         session.close();
 99         sessionFactory.close();
100     }
101 }

 排序order by

分组group by

 1 package com.rong.entity.group;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.Entity;
 7 import javax.persistence.FetchType;
 8 import javax.persistence.GeneratedValue;
 9 import javax.persistence.GenerationType;
10 import javax.persistence.Id;
11 import javax.persistence.OneToMany;
12 
13 @Entity
14 public class Teacher {
15     @Id
16     @GeneratedValue(strategy=GenerationType.AUTO)
17     private int tid;
18     private String tname;
19     @OneToMany(targetEntity=Student.class,fetch=FetchType.LAZY,mappedBy="teacher")
20     private Set<Student> students=new HashSet<Student>();
21     public int getTid() {
22         return tid;
23     }
24     public void setTid(int tid) {
25         this.tid = tid;
26     }
27     public String getTname() {
28         return tname;
29     }
30     public void setTname(String tname) {
31         this.tname = tname;
32     }
33     public Set<Student> getStudents() {
34         return students;
35     }
36     public void setStudents(Set<Student> students) {
37         this.students = students;
38     }
39 }
 1 package com.rong.entity.group;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.FetchType;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.GenerationType;
 7 import javax.persistence.Id;
 8 import javax.persistence.JoinColumn;
 9 import javax.persistence.ManyToOne;
10 
11 @Entity
12 public class Student {
13     @Id
14     @GeneratedValue(strategy=GenerationType.AUTO)
15     private int id;
16     private String name;
17     private int math;
18     private int java;
19     @ManyToOne(targetEntity=Teacher.class,fetch=FetchType.LAZY)
20     @JoinColumn(name="t_id",referencedColumnName="tid")
21     private Teacher teacher;
22     public int getId() {
23         return id;
24     }
25     public void setId(int id) {
26         this.id = id;
27     }
28     public String getName() {
29         return name;
30     }
31     public void setName(String name) {
32         this.name = name;
33     }
34     public int getMath() {
35         return math;
36     }
37     public void setMath(int math) {
38         this.math = math;
39     }
40     public int getJava() {
41         return java;
42     }
43     public void setJava(int java) {
44         this.java = java;
45     }
46     public Teacher getTeacher() {
47         return teacher;
48     }
49     public void setTeacher(Teacher teacher) {
50         this.teacher = teacher;
51     }
52 }
  1 package com.rong.entity.group;
  2 
  3 import java.util.List;
  4 import java.util.Random;
  5 
  6 import org.hibernate.Query;
  7 import org.hibernate.Session;
  8 import org.hibernate.SessionFactory;
  9 import org.hibernate.Transaction;
 10 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 11 import org.hibernate.cfg.Configuration;
 12 import org.hibernate.service.ServiceRegistry;
 13 import org.junit.After;
 14 import org.junit.Before;
 15 import org.junit.Test;
 16 //hql语句(面向):类   对象   属性
 17 public class TestHQL {
 18     SessionFactory sessionFactory;
 19     Session session;
 20     Transaction transaction;
 21     @Before
 22     public void init() {
 23         Configuration configuration = new Configuration().configure();
 24         ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
 25                         .applySettings(configuration.getProperties()).build();
 26         sessionFactory=configuration.buildSessionFactory(serviceRegistry);
 27         session = sessionFactory.openSession();
 28         transaction = session.beginTransaction();
 29     }
 30     //随机生成名字
 31     public String randomName(){
 32         String string="abcdefghijklmnopqrstuvwxyz";
 33         StringBuilder stringBuilder=new StringBuilder();
 34         Random random=new Random();
 35         for(int i=0;i<4;i++){
 36             int index = random.nextInt(string.length());
 37             char charAt = string.charAt(index);
 38             stringBuilder.append(charAt);
 39         }
 40         return stringBuilder.toString();
 41     }
 42     //插入数据
 43     @Test
 44     public void addData(){
 45         Teacher teacher1=new Teacher();
 46         teacher1.setTname("龙老师");
 47         session.save(teacher1);
 48         Teacher teacher2=new Teacher();
 49         teacher2.setTname("高老师");
 50         session.save(teacher2);
 51         Random random=new Random();
 52         for(int i=1;i<=100;i++){
 53             Student student=new Student();
 54             student.setName(randomName());
 55             student.setJava(random.nextInt(100)+1);
 56             student.setMath(random.nextInt(100)+1);
 57             if(random.nextInt(2)==0){
 58                 student.setTeacher(teacher1);
 59             }else{
 60                 student.setTeacher(teacher2);
 61             }
 62             session.save(student);
 63         }
 64     }
 65     //1.根据老师分组统计学生数量(统计每位老师的学生数量)
 66     @Test
 67     public void test1(){
 68         Query query = session.createQuery("select count(s),s.teacher.tname from Student s group by s.teacher.tname");
 69         List<Object[]> list = query.list();
 70         //46高老师
 71         //54龙老师
 72         for (Object[] objects : list) {
 73             for (Object object : objects) {
 74                 System.out.print(object);
 75             }
 76             System.out.println();
 77         }
 78     }
 79     //2.根据老师分组统计学生平均分,总分数
 80     @Test
 81     public void test2(){
 82         Query query = session.createQuery("select sum(s.java+s.math),avg(s.java+s.math),s.teacher.tname from Student s group by s.teacher.tname");
 83         List<Object[]> list = query.list();
 84         //4659 101.2826 高老师 
 85         //5256 97.3333 龙老师 
 86         for (Object[] objects : list) {
 87             for (Object object : objects) {
 88                 System.out.print(object+" ");
 89             }
 90             System.out.println();
 91         }
 92     }
 93     
 94     @After
 95     public void destroy(){
 96         transaction.commit();
 97         session.close();
 98         sessionFactory.close();
 99     }
100 }

 分组过滤having

 1     //根据老师分组统计学生平均分,总分数,并且把老师为1的过滤出来
 2     @Test
 3     public void test3(){
 4         Query query = session.createQuery("select avg(s.java+s.math),sum(s.java+s.math),s.teacher.tname,s.teacher.tid from Student s group by s.teacher.tname having s.teacher.tid=?");
 5         query.setParameter(0, 1);
 6         List<Object[]> list = query.list();
 7         //97.3333 5256 龙老师 1  
 8         for (Object[] objects : list) {
 9             for (Object object : objects) {
10                 System.out.print(object+" ");
11             }
12             System.out.println();
13         }
14     }

聚集函数(统计函数)

 1     //聚集函数(统计函数)  count max min avg sum
 2     @Test
 3     public void test4(){
 4         Long count=(Long) session.createQuery("select count(*) from Student").uniqueResult();
 5         System.out.println("学生总人数:"+count);
 6         int max=(int) session.createQuery("select max(s.java) from Student s").uniqueResult();
 7         System.out.println("java最高成绩:"+max);
 8         int min=(int) session.createQuery("select min(s.math) from Student s").uniqueResult();
 9         System.out.println("math最低成绩:"+min);
10         double avg = (double) session.createQuery("select avg(s.java+s.math) from Student s").uniqueResult();
11         System.out.println("每位学生的平均总成绩:"+avg);
12         Long sum = (Long) session.createQuery("select sum(s.java+s.math) from Student s").uniqueResult();
13         System.out.println("所有学生的总成绩之和:"+sum);
14     }
原文地址:https://www.cnblogs.com/57rongjielong/p/8282509.html