hql语言的使用及与sql语言的区别

1. 什么是hql
   HQL是Hibernate Query Language的缩写

   查全部

2. hql和sql区别/异同
   HQL                                           SQL
   类名/属性                                     表名/列名
   区分大小写,关键字不区分大小写                 不区分大小写
   别名                                          别名
   ?,从下标0开始计算位置(hibernate5之后不支持)  ?,从顺序1开始计算位置
   :命名参数                                     不支持:命名参数
   面向对象的查询语言                            面向结构查询语言

   注1:QuerySyntaxException:book is not mapped

3. 处理返回的结果集
  3.1 单个对象
      select没有逗号
  3.2 Object[]
      b.bookId, b.bookName
  3.3 Map
      new Map(b.bookId as bid, b.bookName as bname)
  3.4 new 构造方法(attr1,attr2)
      new Book(b.bookId, b.price)


4. hql中使用占位符
  4.1 ?占位符
      从下标0开始计算位置
      hibernate5之后不再支持?占位符

  4.2 :命名参数


5. 连接查询

6. 聚合函数
   sum
   avg
   max
   min
   count

7. hql分页
   int page = 2;// 页码:page
   int row = 10;// 每页行数:rows
   query.setFirstResult((page - 1) * row);// 设置起始记录下标
   query.setMaxResults(row);// 设置返回的最大结果集     

扫描二维码关注公众号,回复: 3998787 查看本文章

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

一些测试的实例

package com.zking.seven.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.mysql.cj.x.protobuf.MysqlxDatatypes.Array;
import com.zking.five.entity.Book;
import com.zking.two.util.SessionFactoryUtils;

public class HqlTest {
    private Session session;
    private Transaction transaction;

    // 测试方法前回调用的方法
    @Before
    public void before() {
        session = SessionFactoryUtils.getSession();
        transaction = session.beginTransaction();
    }

    
    /**
     * 结果处理情况一:Book
     *         直接利用对象进行数据接收
     *        jdbc:操作数据库的表
     *
     *         hql:操作实体类
     * 
     */
    @Test
    public void testList1() {
//        Query  相当于   prepareStateent
        Query query = session.createQuery("from Book");
        List<Book> list = query.list();
        for (Book book : list) {
            System.out.println(book);
        }
    }
    
    /**
     * 情况二:String
     *     查一列
     *     jdbc:查的是表中某列,列名不区分大小写
     *     hql:查的是实体类的某一属性,严格区分大小写
     */
    @Test
    public void testList2() {
        String hql = "select bookName from Book";
        List<String> list = session.createQuery(hql).list();
        for (String string : list) {
            System.out.println(string);
        }
    }
    
    /**
     * 情况三:Object[]
     *     查多列
     * 
     */
    @Test
    public void testList3() {
        String hql = "select bookId,bookName from Book";
        List<Object[]> list = session.createQuery(hql).list();
        for (Object[] string : list) {
            System.out.println(Arrays.toString(string));
        }
    }
    
    /**
     * 情况四:利用hibernate内置函数进行处理
     *         map不区分大小写,是hibernate内置的函数
     */
    @Test
    public void testList4() {
        String hql = "select new map(bookId,bookName) from Book";
        List<Map> list = session.createQuery(hql).list();
        for (Map string : list) {
            System.out.println(string);
        }
    }
    
    /**
     * 情况五:利用构造方法处理结果
     *         先提供这些参数的构造方法
     */
    @Test
    public void testList5() {
        String hql = "select new Book(bookId,bookName) from Book";
        List<Book> list = session.createQuery(hql).list();
        for (Book string : list) {
            System.out.println(string);
        }
    }
    
    /**
     * hql中使用占位符
     *         hql:from Book where BookId = ?/:xxx/:BookId
     *         hibernate5之后不再支持?占位符
     * 
     */
    @Test
    public void testList6() {
//        String hql = "from Book where bookId = :BookId";
//        Query query = session.createQuery(hql);
//        query.setParameter("BookId", 2);
//        //查单个
//        Book o = (Book) query.getSingleResult();
//        System.out.println(o);
        
        
//        指定id的书籍
//        String hql = "from Book where price > :min and price < :max";
//        Query query = session.createQuery(hql);
//        query.setParameter("min",10f);
//        query.setParameter("max", 15f);
//        List<Book> list = query.list();
//        for (Book book : list) {
//            System.out.println(book);
//        }
        
        //指定爱好的书籍
        String hql = "from Book where bookId in (:bookIds)";
        Query query = session.createQuery(hql);
        List<Integer> l = new ArrayList<>();
        l.add(1);
        l.add(2);
        l.add(3);
        query.setParameterList("bookIds", l);
//        query.setParameterList("bookIds", new Integer[]    {2,4,5,});
        List<Book> list = query.list();
        for (Book book : list) {
            System.out.println(book);
        }
    }
    
    /**
     * 联表查询
     *     用
     *     hql: select * from Order o,OrderItem oi 
     *         where o.OrderId = oi.order.orderId
     *     
     */
    @Test
    public void testList7() {
        //通过对象的属性或者直接通过对象来关联
//        String hql = "select o.orderNo,oi.quantity from Order o,OrderItem oi where o.orderId = oi.order.orderId";
        String  hql = "select o.orderNo,oi.quantity from Order o,OrderItem oi where o = oi.order";
        Query query = session.createQuery(hql);
        List<Object[]> list = query.list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
    }
    
    /**
     * 聚合函数
     */
    @Test
    public void testList8() {
        String hql = "select count(*) from Book";
        Query query = session.createQuery(hql);
        Object o = query.getSingleResult();
        System.out.println(o);
    }
    
    /**
     * hibernate中的分页
     *         select * from 
     * 需要查询不同的数据库需要在主配置文件中修改配置文件
     */
    @Test
    public void testList9() {
        String hql = " from Book where bookName like :bname";
        int rows = 3;
        int page = 2;
        Query query = session.createQuery(hql);
        query.setParameter("bname", "%不%");
        //设置查询的起始位置
        query.setFirstResult((page-1)*rows);
        //设置每页的数据量
        query.setMaxResults(rows);
        List<Book> list = query.list();
        for (Book book : list) {
            System.out.println(book);
        }
        
    }

    // 执行完测试方法会调用
    @After
    public void after() {
        transaction.commit();
        session.close();
    }
}
 

猜你喜欢

转载自blog.csdn.net/qq_41915592/article/details/83514836