zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【LeetCode】731. 图像渲染
    【LeetCode】130. 被围绕的区域
    小白之HTTP协议熟悉篇
    Java和js常用表达式
    Mysql主主复制高可用解决方案
    解决vue报错:Module build failed (from ./node_modules/_eslint-loader@2.2.1@eslint-loader/index.js): TypeError: Cannot read property 'range' of null
    centos7使用yum安装jdk并配置jdkhome
    阿里nacos安装及使用指南
    js实现给html固定区域增加水印
    MySQL安装教程
  • 原文地址:https://www.cnblogs.com/liuyingke/p/7147564.html
Copyright © 2011-2022 走看看