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 }
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 }
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>
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 }
以上是关于Hibernate检索(上)的主要内容,如果未能解决你的问题,请参考以下文章