zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    [北京.NET俱乐部]征集T恤设计方案
    [新功能]个人Blog首页分页浏览
    [公告]关于用户资料的保密
    奇怪的邮件与MSN密码
    文章发布功能改动
    [活动]北京.NET俱乐部首次活动照片及讲课资料
    [活动公告]上海.NET俱乐部首次活动预告
    [征询意见]关于开设.NET 2.0专题
    [北京.NET俱乐部活动]参加者签名并谈一下感受
    CSS3 transform 2D实验(1)
  • 原文地址:https://www.cnblogs.com/57rongjielong/p/8282509.html
Copyright © 2011-2022 走看看