Hibernate检索(上)

Posted Mr.Liu’blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate检索(上)相关的知识,希望对你有一定的参考价值。

什么是HQL检索

HQL(Hibernate Query Language)是面向对象的查询语言,具有丰富灵活的特性

在Hibernate提供的各种检索方式中,HQL是使用最为广泛的一种检索方式,也是官方推荐的查询模式

Hibernate检索方式的功能

可以在查询语句中设定查询条件,动态绑定参数

支持投影查询

支持分页查询

支持链接查询

支持分组查询,可以使用having和group by关键字

内置聚集函数,如sum()、min()、max()等

可调用用户自定义函数

支持子查询

HQL检索步骤

 

 

HQL查询语法结构

【select/update/delete…】 【 from …】 【 where …】 【 group by…】 【 having…】 【 order by…】

HQL语法规则

HQL语句的关键字不区分大小写,但推荐小写。

HQL中出现的类名,属性名严格区分大小写。

可以为类设置别名,以供其他地方引用,例如 as t。

as 关键字是可选的,一般别名推荐小写。

from前也可以加select 但必须配合别名使用。

1.实体类

 1 package cn.yunhe.entity;
 2 
 3 import javax.persistence.*;
 4 
 5 /**
 6  * Created by Administrator on 2017/7/10.
 7  */
 8 @Entity
 9 @Table(name = "qx")
10 public class Qx {
11     private int qxId;
12     private String qxName;
13 
14     public Qx() {
15     }
16 
17     public Qx(int qxId, String qxName) {
18         this.qxId = qxId;
19         this.qxName = qxName;
20     }
21 
22     @Id
23     @GeneratedValue
24     @Column(name = "qxid")
25     public int getQxId() {
26         return qxId;
27     }
28 
29     public void setQxId(int qxId) {
30         this.qxId = qxId;
31     }
32 
33     @Column(name = "qxname")
34     public String getQxName() {
35         return qxName;
36     }
37 
38     public void setQxName(String qxName) {
39         this.qxName = qxName;
40     }
41 }
Qx(区县)
 1 package cn.yunhe.entity;
 2 
 3 import javax.persistence.*;
 4 import java.util.Date;
 5 
 6 /**
 7  * Created by Administrator on 2017/7/10.
 8  */
 9 @Entity
10 @Table(name = "t_user")
11 public class User {
12     private int userId;
13     private String uName;
14     private String uPwd;
15     private int age;
16     private Date hiredate;
17 
18     @Id
19     @GeneratedValue
20     @Column(name = "userid")
21     public int getUserId() {
22         return userId;
23     }
24 
25     public void setUserId(int userId) {
26         this.userId = userId;
27     }
28 
29     @Column(name = "uname")
30     public String getuName() {
31         return uName;
32     }
33 
34     public void setuName(String uName) {
35         this.uName = uName;
36     }
37 
38     @Column(name = "upwd")
39     public String getuPwd() {
40         return uPwd;
41     }
42 
43     public void setuPwd(String uPwd) {
44         this.uPwd = uPwd;
45     }
46 
47     @Column(name = "age")
48     public int getAge() {
49         return age;
50     }
51 
52     public void setAge(int age) {
53         this.age = age;
54     }
55 
56     @Column(name = "heredate")
57     public Date getHiredate() {
58         return hiredate;
59     }
60 
61     public void setHiredate(Date hiredate) {
62         this.hiredate = hiredate;
63     }
64 }
User(用户)

2.配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration
 3         PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6     <session-factory>
 7         <!--自动生成表,正向工程-->
 8         <property name="hibernate.hbm2ddl.auto">update</property>
 9         <!--数据库方言-->
10         <property name="hibernate.dialect" >org.hibernate.dialect.mysqlDialect</property>
11         <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
12         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
13         <property name="connection.username">root</property>
14         <property name="connection.password">1234</property>
15         <!--显示底层sql语句-->
16         <property name="show_sql">true</property>
17 
18         <mapping class="cn.yunhe.entity.Qx"/>
19         <mapping class="cn.yunhe.entity.User"/>
20     </session-factory>
21 </hibernate-configuration>
hibernate.cfg.xml

3.测试类

  1 package cn.yunhe.demo;
  2 
  3 import cn.yunhe.entity.Qx;
  4 import cn.yunhe.entity.User;
  5 import org.hibernate.Query;
  6 import org.hibernate.Session;
  7 import org.hibernate.Transaction;
  8 import org.hibernate.cfg.AnnotationConfiguration;
  9 import org.hibernate.cfg.Configuration;
 10 import org.junit.After;
 11 import org.junit.Before;
 12 import org.junit.Test;
 13 
 14 import java.util.List;
 15 
 16 /**
 17  * Created by Administrator on 2017/7/10.
 18  */
 19 public class Demo {
 20     Session session=null;
 21     Transaction tr=null;
 22     @Before
 23     public void init(){
 24         Configuration config=new AnnotationConfiguration().configure();
 25         session=config.buildSessionFactory().openSession();
 26         tr=session.beginTransaction();
 27     }
 28 
 29     @Test//查询所有的区县
 30     public void test1(){
 31         String hql="from Qx";
 32        Query query= session.createQuery(hql);
 33         List<Qx> list= query.list();
 34         for (Qx qx:list){
 35             System.out.println(qx.getQxName());
 36         }
 37     }
 38 
 39     @Test//  实体查询 where条件查询
 40     public void test2(){
 41         String hql="from Qx q where qxName like \'%高%\'";
 42         List<Qx> list=session.createQuery(hql).list();
 43         for (Qx qx:list){
 44             System.out.println(qx.getQxName());
 45         }
 46     }
 47 
 48     @Test //属性查询
 49     //多个属性查询,返回的集合元素是对象数组,数组元素的类型和
 50     //对应的属性在实体类中的类型一致,数组的长度取决于select
 51     // 中属性的个数。
 52     public void test3(){
 53         String hql="select q.qxName from Qx q";
 54         List<String> list =session.createQuery(hql).list();
 55         for (String name:list){
 56             System.out.println(name);
 57         }
 58     }
 59 
 60     @Test//属性查询  动态构造对象
 61     public void test4(){
 62         String hql="select new Qx(q.qxId,q.qxName) from Qx q";
 63         List<Qx> list= session.createQuery(hql).list();
 64         for (Qx qx :list){
 65             System.out.println(qx.getQxName());
 66         }
 67     }
 68 
 69     @Test//参数绑定  按照位置绑定
 70     //1.必须按照参数的顺序,调用相应的setType()方法赋值。
 71     // 2.参数的下标从0开始。
 72     // 3.如果有多个参数的时候,必须保证每个参数都被绑定
 73     public void test5(){
 74         String hql="from Qx as q where q.qxName like ?";
 75         Query query= session.createQuery(hql);
 76          query.setString(0,"%高%").list();
 77         List<Qx> list=query.list();
 78         for (Qx qx:list){
 79             System.out.println(qx.getQxId()+","+qx.getQxName());
 80         }
 81     }
 82 
 83     @Test//参数绑定 按名称绑定
 84     //1.在HQL查询语句中定义命名参数时以 “:”开头。
 85     //2.Query提供的方法能绑定各种类型的参数。此类 setXXX()方法中,第一个参
 86     // 数用于设置各种类型的命名参数,第二个参数表示命名参数的值。
 87     public void test6(){
 88         String hql="from Qx as q where q.qxName=:name";
 89         Query query=session.createQuery(hql);
 90         query.setString("name","黄河区");
 91         List<Qx> list=query.list();
 92         for (Qx qx:list){
 93             System.out.println(qx.getQxId()+","+qx.getQxName());
 94         }
 95 
 96     }
 97 
 98     @Test//使用聚合函数   count()
 99     public void test7(){
100         String hql="select count(q.qxId) from Qx q";
101         Query query=session.createQuery(hql);
102         Long count= (Long) query.uniqueResult();
103         System.out.println("一共有"+count+"个区县!");
104     }
105 
106     @Test//使用聚合函数   max()  min() 用法一样: avg()   sum()
107     public void test8(){
108         String hql="select max(q.qxId),min(q.qxId)from Qx q";
109         Query query= session.createQuery(hql);
110         List<Object[]> list= query.list();
111         Object[] arr=list.get(0);
112         System.out.println("最大区县id:"+arr[0]);
113         System.out.println("最小区县id:"+arr[1]);
114 
115     }
116 
117     @Test//排序:order by
118     // 分组与排序用法相同:group by having子句可以对group by子句进行甄选
119     public void test9(){
120         String hql="from Qx as q order by q.qxId desc ";
121         List<Qx> list= session.createQuery(hql).list();
122         for (Qx qx:list){
123             System.out.println(qx.getQxId()+","+qx.getQxName());
124         }
125     }
126 
127     @Test//分页查询 主要通过Query的以下两个方法:
128     //setFirstResult(int firstResult)设定从哪一个对象开始检索
129     //setMaxResult(int maxResults)设定一次最多检索出的对象数目
130     public void test10(){
131         String hql="from Qx ";
132         Query query=session.createQuery(hql);
133         query.setFirstResult(1);
134         query.setMaxResults(3);
135         List<Qx> list=query.list();
136         for (Qx qx:list){
137             System.out.println(qx.getQxId()+","+qx.getQxName());
138         }
139     }
140     @Test//子查询  查询年龄最大的用户
141     public void test11(){
142         String hql="select u from User u where u.age=(select max(age) from User)";
143         Query query= session.createQuery(hql);
144         List<User> list=query.list();
145         for (User user :list){
146             System.out.println("年龄最大的用户是:"+user.getuName()+",年龄:"+user.getAge());
147         }
148     }
149 
150 
151 
152     @After
153     public void down(){
154         session.close();
155     }
156 
157 }
Demo

 

以上是关于Hibernate检索(上)的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate —— 检索策略

用于从 cloudkit 检索单列的代码模式/片段

hibernate 分页代码

如何从片段中检索gridview中的图像?

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

Hibernate5-课程笔记6