zoukankan      html  css  js  c++  java
  • Hibernate_HQL

    20170327 Hibernate_HQL压缩包参照代码

    HQL定义

    1.HQL:Hibernate query language,Hibernate查询语言。

    2.HQL是面向对象的查询语言。

      HQL 查询主体,映射配置的持久化类及其属性

      SQL 查询主题,数据库表

    3.HQL提供了丰富灵活的查询特性,Hibernate官方推荐查询方式

    ---------------------------------

    HQL语句形式:

    from子句是必须的,最简单的HQL语句可以只有from子句。clause 美 [klɔz]  n. 从句,子句

    select  from where   groupby  having orderby

    子句  子句  子句  子句  子句  子句

    ----------------------------------

    初学HQL注意的问题

    1..HQL是面向对象的查询语言,对Java类与属性大小写敏感

    注意:HQL与SQL形式像似,本质不同,一定注意。

    2.HQL对关键字不区分大小写,但是习惯上为了美观全部小写

    ====查询准备========================================

    Query接口

    org.hibernate.Query接口

    1.Query接口定义有执行查询的方法

        Hibernate

    HQL--------------解析HQL语句/配置信息------------>SQL语句

    2.Query接口支持方法链编程风格,使程序代码更为简洁

    Query实例创建

      1.Session的createQuery()方法创建Query实例

      2.createQuery()方法包含一个语句参数,createQuery(hql)

    Query执行查询

      1.Query接口的list()方法执行HQL查询

      2.List()方法返回结果数据类型为java.util.List,List集合中存放符合查询条件的持久化对象

     JUnit测试类的@Test都需要一下两个,用来获得和关闭session

     @Before
     public void setUp() throws Exception {
      session = HibernateSessionFactory.getCurrentSession();
     }

     @After
     public void tearDown() throws Exception {
      session.close();
     }

    @Test
     public void testSelectClauseSelf(){
      String hql = " from Seller";
      Query query = session.createQuery(hql);
      List<Seller> sellers = query.list();
      
      for(Seller seller : sellers){
       System.out.println(seller.tostring());

      }
     }

     ====From子句==================================

    From子句:

      HQL语句最简形式

      from指定了HQL语句查询主体-持久化类及其属性

     @Test
     public void testFromClause(){
      String hql = " from Customer ";
      
      Query query = session.createQuery(hql);
      List<Customer> customers = query.list();
      
      for(Customer customer : customers){
       System.out.println("name:"+customer.getName());
      }
     }

    ---------------------------------

    public class Commodity implements Serializable {
     private Long id;// 主键
     private String name;// 名称
     private Double price;// 价格
     private String unit;// 单位
     private String category;// 类别
     private String description;// 简介
     private Seller seller;// 商家

    +getter setter

    ------------------------

     @Test懒加载状态,在需要使用外键信息时如(a)时,才查询
     public void testFromClause(){
      String hql = " from Commodity ";
      
      Query query = session.createQuery(hql);
      List<Commodity> commodities = query.list();
      
      for(Commodity c : commodities){
       System.out.println("name:"+c.getName());
       
       System.out.println("seller's name :"+c.getSeller().getName());//(a)
      }
     }

     ---from子句中持久化类的引用----------------------------------------------

    1.不需要引用持久化类的全限定名,直接引入类名

    全限定名com.imooc.model.Seller(一定要指明权限定名,Java环境才知道去哪获取这个类)

    类名:from Seller

    2.auto-import(自动引入)缺省情况(Hibernate根据配置信息自动导入)

    @Test
     public void testSelectClauseSelf(){
      String hql = " from Seller";

    //String hql = " from com.imooc.model.Seller";//结果一致
      Query query = session.createQuery(hql);
      List<Seller> sellers = query.list();
      
      for(Seller seller : sellers){
       System.out.println(seller.tostring());

      }
     }

    ----from 子句别名的使用-------------------------------------------------

    1.为被查询的类指定别名

    2.在HQL语句其他部分通过别名引用该类(多用于查询多个持久化类的时候)

    3.别名命名习惯

      别名与持久化类名相同from Seller 别名:1 seller ,2单字母 s

     @Test
     public void testFromClause(){
      String hql = " from Seller  s ";//from Seller as seller

     //from Seller  s,Customer c
      
      Query query = session.createQuery(hql);
      
      List<Seller> sellers = query.list();
      for(Seller seller : sellers){
       System.out.println("name:"+seller.getName());
      }
     }

    ===Select 子句======================================

    1.返回Object[]:未指定返回值类型时,默认返回Object[]

    用select指定需要查询的字段

     /*查询多个属性时
      * 1.name 2.tel 3.address 4.star
      */

     @Test
     public void testSelectClauseObjectArray(){
      String hql = " select s.name s.address from Seller s ";
      
      Query query = session.createQuery(hql);
      
      List<Object[]> list = query.list();
      
      for(Object[] objs : list){
       System.out.println("name:"+objs[0]);

       System.out.println("address:"+objs[1]);
      }
     }

    //查询一个属性时
     @Test
     public void testSelectClauseObjectArray(){
      String hql = " select s.name from Seller s ";
      
      Query query = session.createQuery(hql);
      
      List<Object> list = query.list();
      
      for(Object obj : list){
       System.out.println("name:"+obj);
      }
     }

    ----------------------------------------

    通过list返回:
    1.select子句中使用new list指定
    List Object[] Map,根据习惯选择返回方式
     @Test
     public void testSelectClauseList(){
      String hql = " select new list(s.name,s.tel,s.address) from Seller s ";
      
      Query query = session.createQuery(hql);
      List<List> lists = query.list();
      
      for(List list : lists){
       System.out.println("name : "+list.get(0));
       System.out.println("tel:"+list.get(1));
       System.out.println("address:"+list.get(2));
      }
     }

    通过Map返回: 
    1.select子句中使用new map指定
    2.key值为索引值(属性在HQL中的位置信息),字符串类型
     @Test
     public void testSelectClauseMap(){
      String hql = " select new map(s.name,s.tel,s.address) from Seller s ";
      Query query =session.createQuery(hql);
      
      List<Map> maps = query.list();
      for(Map map : maps){
       System.out.println("name:"+map.get("0"));
       System.out.println("tel:"+map.get("1"));
       System.out.println("address:"+map.get("2"));
      }
      
     }
     //Map获得查询结果是,可以考虑用别名获取属性信息
     String hql = " select new map(s.name as name,s.tel as tel,s.address as address) from Seller s ";
       System.out.println("name:"+map.get("name"));
       System.out.println("tel:"+map.get("tel"));
       System.out.println("address:"+map.get("address"));
    ----通过自定义类型返回查询结果--------------------------------------------------
    1.持久化类中定义相应的构造器
    2.select子句中调用定义的构造器contructor
    1)contructor
    public class Seller implements Serializable {
     private Long id;// 主键
     private String name;// 名称
     private String tel;// 电话
     private String address;// 地址
     private String website;// 网站
     private Integer star;// 星级
     private String business;// 经营范围
     
     public Seller(){
      
     }
     
     public Seller(String name,String tel,String address){
      this.name = name;
      this.tel = tel;
      this.address = address;
     }

    2)test
     @Test
     public void testSelectClauseSelf(){
      String hql = " select new Seller(s.name,s.tel,s.address) from Seller s ";
      Query query = session.createQuery(hql);
      List<Seller> sellers = query.list();
      
      for(Seller seller : sellers){
       System.out.println("name: "+seller.getName());
       System.out.println("tel:"+seller.getTel());
       System.out.println("address:"+seller.getAddress());
      }
     }
    --- 持久化类中无参构造方法的必要性-------

    HQL中没有指定构造器时,会使用默认构造器(无参构造器default contrustor)
    增加自定义构造器时,一定不要忘记无参构造器
    --- distinct关键字------
    1.使用distinct去除查询结果中的重复元素
    select sex from Customer c=> men,men,wemon
    select distinct sex from Custmor c=>men ,wemon
     @Test
     public void testDistinct(){
      String hql = "select distinct c.sex from Customer c ";
      Query query = session.createQuery(hql);
      List<Object> list = query.list();
      
      for(Object obj : list){
       System.out.println(obj);
      }
     }
     

    ====限制-where子句=================================

    where子句:逻辑表达式,设置查询条件,限制返回结果

    --比较运算-----------------------

    1.=,<>,<,>,>=,<=
    2.null值判断-is [not] null
    HQL支持=null,<>null判断
    HQL        SQL
    x=null   x is null
    x<>null  x is not null


     @Test
     public void testWhere1(){
      String hql = " from Commodity c where c.price<=200 ";
      Query query = session.createQuery(hql);
      List<Commodity> commodities = query.list();
      
      for(Commodity c : commodities){
       System.out.println("name:"+c.getName());
       System.out.println("price:"+c.getPrice());
      }
     }
    --null值判断----------------------- 

     @Test
     public void testWhere1(){
      String hql = " from Commodity c where c.description is null ";// '= null' is ok as well
      Query query = session.createQuery(hql);
      List<Commodity> commodities = query.list();
      
      for(Commodity c : commodities){
       System.out.println("name:"+c.getName());
       System.out.println("description:"+c.getDescription());
      }
     }
    --范围运算-----------------------
    1.[not] in (列表)
    1.[not] between value1 and value2

     public void testWhere2(){
      String hql = " from Customer c where c.age in(20,40) ";
      //String hql = " from Customer c where c.age not between 20 and 40 ";
      Query query = session.createQuery(hql);
      List<Customer> customers = query.list();
      
      for(Customer c: customers){
       System.out.println("name:"+c.getName());
       System.out.println("age:"+c.getAge());
      }
     }

    --字符串模式匹配-----------------------
    1.like关键字 通过通配符设置
    2.通配符%:匹配任意字符,_:匹配一个字符
     @Test
     public void testWhere3(){
      String hql = " from Customer c where c.name like '张_'";
      //String hql = " from Customer c where c.address like '%北京%'";
      Query query = session.createQuery(hql);
      List<Customer> customers = query.list();
      
      for(Customer c : customers){
       System.out.println("name:"+c.getName());
       System.out.println("address :"+ c.getAddress());
      }
     }
    --逻辑运算-----------------------
    逻辑运算符
    1.and(逻辑与),or(逻辑或)
    2.not(逻辑非)
     @Test
     public void testWhere2(){
      String hql  = " from Commodity c where c.price between 1000 and 5000 and c.category like '%电脑%' or name like '%硬盘%' ";
      Query query = session.createQuery(hql);
      List<Commodity> commodities = query.list();
      
      for(Commodity c : commodities){
       System.out.println("name:"+c.getName());
       System.out.println("category:"+c.getCategory());
       System.out.println("price:"+c.getPrice());
      }
     }

    --集合运算-----------------------

    HQL的特殊功能
    1.is [not] empty 集合[不]为空,不包含任何元素
    2.member of 元素属于集合
    HQL  SQL
    empty -> exists
    member of -> in

     @Test
     public void testWhere1(){
      String hql = " from Order o where o.orderItems is not empty ";
      Query query = session.createQuery(hql);
      List<Order> orders = query.list();
      
      for(Order order : orders){
       System.out.println(order.getCustomer().getName());
       System.out.println(order.getAmount());
       System.out.println(order.getTradeDate());
      }
     }

    --四则运算----------------------
    1.HQL语句中也可以使用+-*/四则运算
    2.四则运算可以在where子句和select子句中使用
     @Test
     public void testWhere4(){
      String hql = " from Commodity c where c.price*5>3000 ";
      Query query = session.createQuery(hql);
      List<Commodity> commodities = query.list();
      
      for(Commodity c : commodities){
       System.out.println("name:"+c.getName());
       System.out.println("price:"+c.getPrice()*5);
      }
     }
     

    --查询单个对象----------------------
    1.Query接口的uniqueResult方法,返回实例对象,不返回list
    2.where子句条件设置(限定为单个结果,如果不能返回独立结果或没有结果,则执行中出异常终止运行)


     public void testWhere4(){
      String hql = " from Customer c where c.name = "张三" ";
      Query query = session.createQuery(hql);
      
      Customer c = (Customer)query.uniqueResult();
      
      System.out.println(c.getName());
     }
    ===排序orderby 子句==========================================
    1.使用orderby 子句对查询结果进行排序
    1.升序  asc(不指定时默认升序)
    2.降序 desc
     @Test
     public void testOrderby(){
      String hql = " from Commodity order by seller.id asc,price desc,name asc  ";
      Query query = session.createQuery(hql);
      List<Commodity> commodities = query.list();
      
      for(Commodity c : commodities){
       System.out.println("name:"+c.getName());
       System.out.println("price:"+c.getPrice());
      }
     }
    =================
    ---------------------------------
    1.HQL语句形式:
    from子句是必须的,最简单的HQL语句可以只有from子句。clause 美 [klɔz]  n. 从句,子句
    select  from where   groupby  having orderby
    子句  子句  子句  子句  子句  子句
    ----------------------------------
    2.初学HQL注意的问题
     1..HQL是面向对象的查询语言,对Java类与属性大小写敏感
     注意:HQL与SQL形式像似,本质不同,一定注意。
     2.HQL对关键字不区分大小写,但是习惯上为了美观全部小写
    3.别名的使用,命名规则可参照java
    4.select子句使用自定义类返回选择属性,持久化类构造器处理(注意默认构造器)

    其他参考资料:

    http://www.blogjava.net/algz/articles/191835.html

    http://blog.163.com/hbsi_zhouwufeng/blog/static/438725362008106113129903/


     
     

  • 相关阅读:
    BZOJ 1070 修车
    BZOJ 1927 SDOI2010 星际竞速 最小费用最大流
    LOJ 2321 清华集训2017 无限之环 拆点+最小费用最大流
    EZOJ 宝石迷阵 建图+网络流匹配
    BZOJ 1711 吃饭dining/Luogu P1402 酒店之王 拆点+最大流流匹配
    POJ 1637 Sightseeing tour 建图+网络流
    POJ 1149 PIGS 建图,最大流
    【2018 1月集训 Day1】二分的代价
    【2019 1月集训 Day1】回文的后缀
    20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串
  • 原文地址:https://www.cnblogs.com/charles999/p/6627046.html
Copyright © 2011-2022 走看看