Hql(01)

news/2024/10/23 7:22:16/

一:什么是Hql

     HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。

二:hql和sql区别/异同(面试题)

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

 

三 :Hql处理返回的结果集

 1 直接利用对象进行接收  单个对象(单个的实体类,单个的String类型 单个的Integer)
      有没有逗号“,”


 2 Object[]
      b.bookId, b.bookName

 

 3 利用hibernate内置函数   Map进行结果处理

  Map(取某个类或者多个类的属性)
      map是 hql的特定语法 不是接口(接口是不能new 出来的)也不是实体类
    String hql=select  new Map(b.bookId as bid, b.bookName as bname) from Book as b

 4 new 构造方法(attr1,attr2)

       注意:当你给某一个实体类提供有参构造器  顺便加上无参构造器

 

 

  四: hql中使用占位符
    String hql="from Book where bookId = : bookid";
 

      给占位符赋值

     query.setParameter("bookid", 2);

   //获取单个 query.getSingleResult();

 

五:连接查询 

hql:select * from Order o, OrderItem oi where o.orderId=oi.oid
           或者

//通过对象直接关联
hql:select * from Order o, OrderItem oi   where o.orderId=oi.order.orderId       

 

六:  聚合函数
       sum
       avg
       max


       min
       count

七:hql分页

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

 

 

package com.zking.seven;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.zking.five.entity.Book;
import com.zking.two.util.SessionFactoryUtil;public class HqlTest {private Session session;private Transaction transaction;@Beforepublic void before() {session = SessionFactoryUtil.getSession();transaction = session.beginTransaction();}@Afterpublic void after() {transaction.commit();session.close();}/*** 结果处理情况一:直接利用对象进行接收* select * from t_hibernate_book* list<Book> list=this.BookDao.excuteQuery()* hql:操作的是实体类* * * select * from t_hibernate_book讲解* * resultset  rs* * 			1	西游记	50* 			2	红楼梦	50* 			3	水浒* 获取类对象* 		Class clz=Book.class;* while(rs.next){* 			clz.newInstance();* 			Field[] Fields=clz.getDecareledFields();* 			//遍历* 			for(Field f:Fields){* 				//设置值* 				f.set(b,rs.getObject(1))* 			)* 			list.add(b);* }* * * */@Testpublic void testList(){String hql="from Book";Query query = session.createQuery(hql);List<Book> list = query.list();//list.forEach(System.out::println);for (Book book : list) {System.out.println(book);}}/*** 结果处理情况二:* 查一列*  jdbc:查的是表中的某一列  列名不区分大小写*  *  hql:查的是实体类的属性   严格区分大小写*/@Testpublic void testList2() {String hql="select bookName from  Book";Query query = session.createQuery(hql);List<String> list = query.list();list.forEach(System.out::println);}/*** 结果处理情况三:Object[]数组* mvc-->EntityBaseDao.insert(sql,keys,Book book)* 表            8* 实体类     8* Book book 值 6* keys  new String[6]* * 给的类有八个但是赋值进去的是6个* * map集合就不需要理会实体类* * * */@Testpublic void testList3() {String hql="select bookId,bookName from Book";List<Object[]> list=session.createQuery(hql).list();for (Object[] book : list) {System.out.println(Arrays.toString(book));}//list.forEach(System.out::println);}/*** 结果处理情况4:利用hibernate内置函数进行结果处理* 这里的map不是接口 也不是实体类  是hibernate的内置函数*/@Testpublic void testList4() {String hql="select new map(bookId,bookName) from Book";List<Map> list=session.createQuery(hql).list();/*for (Map m : list) {System.out.println(m);}*/list.forEach(System.out::println);}/*** 结果处理情况5:利用构造方法进行结果处理 new Book()* 1.当你给某一个实体类提供有参构造器  顺便加上无参构造器* 2.构造方法的赋值原理* 	* 通过sql语句查到   1  红楼梦* 				   2  西游记*                得到结果集 resultset*                Class clz=Book.class*                然后获取其构造器*               construct c= clz.getDecaekdconstruct();*               获取其有参构造器的参数*/@Testpublic void testList5() {String hql="select new Book(bookId,bookName) from Book";List<Book> list=session.createQuery(hql).list();/*for (Map m : list) {System.out.println(m);}*/list.forEach(System.out::println);}/*** hql中使用占位符*  sql中 select * from t_hibernate_book where book_id=?*  *  hql:from Book where bookId =:bookid*/@Testpublic void testList6() {
//		String hql="from Book where bookId = : bookid";
//		Query query = session.createQuery(hql);
//		query.setParameter("bookid", 2);
//		//获取单个
//		Book book = (Book) query.getSingleResult();
//		System.out.println(book);//查询价格在 45 到55之间的书籍
//		String hql="from Book where price > : min and price < : max";
//		Query query = session.createQuery(hql);
//		query.setParameter("min", 45f);
//		query.setParameter("max", 55f);
//		List<Book> list = query.list();
//		list.forEach(System.out::println);String hql="from Book where bookId in (:bookIds)";Query query = session.createQuery(hql);List<Integer> params=new ArrayList<>();params.add(1);params.add(2);params.add(4);query.setParameterList("bookIds", params);//②query.setParameterList("bookIds", new Integer[] {2,4,5});List<Book> list = query.list();list.forEach(System.out::println);}/*** 连接查询 * jdbc :* * hql:select * from Order o, OrderItem oi*      where o.orderId=oi.oid*      或者* hql:select * from Order o, OrderItem oi*      where o.orderId=oi.order.orderId*/@Testpublic void testList7() {//String hql="select o.orderNo,oi.productId from Order o, OrderItem oi where o.orderId=oi.order.orderId";//通过对象直接关联String hql="select o.orderNo,oi.productId from Order o, OrderItem oi where o=oi.order";Query query = session.createQuery(hql);List<Object[]> list = query.list();for (Object[] book : list) {System.out.println(Arrays.toString(book));}}/*** 聚合函数的讲解* * 6. 聚合函数sumavgmaxmincount*/@Testpublic void testList8() {String hql="select count(*) from Book";Query query = session.createQuery(hql);Object result = query.getSingleResult();System.out.println(result);}/*** 讲解hibernate中的分页* int rows=3* int page=2* jdbc : select * from  t_hibernate_book where book_name like '?'*   sql+=limit ?,?*   *   第一个问号 代表起始位置 (page-1)xrows 3*   第二个问号 代表偏移量  rows  3*/@Testpublic void testList9() {String hql="from Book where bookName like : bookname";int rows=5;int page=1;Query query = session.createQuery(hql);query.setParameter("bookname", "%浮生%");query.setFirstResult((page-1)*rows);query.setMaxResults(rows);List<Book> list = query.list();list.forEach(System.out::println);}}



 报错1:原因是hql语句有语法错误

 

 unexpected token 意外的符号  hql语句有语法错误

符号

 

 

报错2:reason: 处理返回结果集 用的是new 构造方法(attr1,attr2)而实体类
没有默认的构造器(解:去实体类写一个默认的构造器)

   

 

报错3:reason: 测试类中少些@Test

 


http://www.ppmy.cn/news/470558.html

相关文章

HQL(二)

一、写BaseDao 需求&#xff1a; 按名字分页查询对应书籍信息 我们用hql是想我们的需求&#xff0c;是这样的&#xff1a; public List<Book> list1(Book book,PageBean pageBean){Session session SessionFactoryUtils.getSession();Transaction transaction sess…

蓝桥杯Java知识准备

1.输入输出 提到了几个IO类&#xff0c;这里推荐使用BufferedReader输入&#xff0c;BufferedWriter输出&#xff0c;当输入输出的数据量大于一百万左右就必须使用快速IO不能直接使用Scanne和System.out.print。 1.1 正常输入输出 输入 首先定义一个Scanner对象&#xff0c…

lq到底是什么意思_LQ是什么意思..?!谁知道..!?

导航:网站首页 > LQ是什么意思..?!谁知道..!? LQ是什么意思..?!谁知道..!? 匿名网友: 导商Leading Quotient——LQ。 导商即为领导商,是指一个人领导、指导、引导、带领他人或团队组织的智慧和能力的商数。 导商既取决于领导理论与方式,又取决于领导环境与气氛;既取…

qml-2 定位

xyz布局定位 继承体系 Button ->AbstractButton->Control->Item->QQuickItem 介绍&#xff1a;The QQuickItem class provides the most basic of all visual items in Qt Quick 属性&#xff1a; x : qreal Defines the items x position relative to its pa…

并行Linq

并行LINQ 并行查询 .NET4在System.Linq名称空间中包含一个新类ParalleIEnumerable ,可以分解查询的工作使其分布在多个线程上。尽管Enmerable类给IEnunerable<T>接口定义了扩展方法,但 ParalleIEnumerable 类的大多数扩展方法是ParallelQuery<TSource>类的扩展。…

L1、L2的作用

L范式都是为了防止模型过拟合&#xff0c;所谓范式就是加入参数的约束。 L1的作用是为了矩阵稀疏化。假设的是模型的参数取值满足拉普拉斯分布。 L2的作用是为了使模型更平滑&#xff0c;得到更好的泛化能力。假设的是参数是满足高斯分布。 借用公众号python与算法社区的内容20…

PLSQL(二)

PLSQL(二&#xff09; 通过本文将学习到 NULL的判断IF控制语句循环控制语句定义复杂类型游标的处理例外的声明函数与存储过程的使用PLSQL中程序包的作用 2、NULL的判断 我一直以为NULL读nang&#xff0c;因为从我开始学计算机的时候别人就这么读。但是我昨天听到有人读no&a…

LDPC概率译码原理实例说明

1.1译码公式理解 译码公式的证明很多书籍里边已有介绍&#xff0c;这里不做证明直接引用。介绍Gallager概率译码公式之前先介绍引理&#xff1a;二进制序列长度为m且相互独立&#xff0c;第i个bit为1的概率为 P i P_{i} Pi​&#xff0c;那么整个序列为偶数个1的概率为&#x…