Hibernate的hql语言

前言

今天为大家分享的是hibernate中的一种语言,hql语言!

hql语言

可能会用到的相关实体类代码,可以去这两篇博客中粘贴:

1、多对多映射

2、一对多映射

1、hql语言概念

HQL是Hibernate Query Language的缩写,也就是hibernate的查询语言!

2、sql和hql的区别

hqlsql
from关键字后接的是实体类from关键字后接的是表名
区分大小写,但是关键字不区分大小写不区分大小写
支持命名参数不支持命名参数
?,从下标0开始计算位置?,从顺序1开始计算位置
面向对象的查询语言面向结构的查询语言

案例演示

1、代码实现

以下案例是使用junit4单元测试,基于我的上一个项目完成的!

package com.wangqiuping.dao;

import java.util.Arrays;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import com.wangqiuping.util.SessionFactoryUtils;

public class Test {
    
   Session session=null;
   Transaction ts=null;

@Before
public void setUp() throws Exception {
	session=SessionFactoryUtils.openSession();
	Transaction ts = session.beginTransaction();
}

@After
public void tearDown() throws Exception {
	ts.commit();
	SessionFactoryUtils.closeSession();
}

@org.junit.Test
public void test() {

	//查询返回List	
	String  hql="from Book";
	List list = session.createQuery(hql).list();
	list.forEach(b->{
		System.out.println(b);
	});
		
	//单个对象
	String  hql="from Book b  where b.bookId=1";
	List list = session.createQuery(hql).list();
	list.forEach(b->{
		System.out.println(b);
	});
	
	
	//Object[]
	String  hql="select bookId,bookName,price from Book";
	Query query = session.createQuery(hql);
	List<Object[]> list=query.list();
	list.forEach(b->{
		System.out.println(Arrays.toString(b));
	});
	
	
	//Map集合
	String  hql="select new Map(b.bookId as bookId,b.bookName as bookName,b.price as price) from Book b";
	Query query = session.createQuery(hql);
	List<Map> list= query.list();
	list.forEach(b->{
		System.out.println(b);
	});
	
	
	//构造方法
	String  hql="select new Book(b.bookId as bookId,b.bookName as bookName,b.price as price) from Book b";
	Query query = session.createQuery(hql);
	List list = query.list();
	list.forEach(b->{
		System.out.println(b);
	});
	
	//命名参数
	String hql="from Book b where b.price>:min and b.price<=:max";
	Query query = session.createQuery(hql);
	query.setParameter("min", 20f);
	query.setParameter("max",120f);
	List list = query.list();
	list.forEach(b->{
		System.out.println(b);
	});
	
	//聚合函数  sum() count()  max()  avg()  min()
	String  hql="select sum(price),avg(price),count(price),max(price),min(price) from Book";
	Query query = session.createQuery(hql);
	List<Object[]> list=query.list();
	list.forEach(b->{
		System.out.println(Arrays.toString(b));
	}); 
  }
}

聚合函数中的这行代码是jdk8新特性的一种遍历方式!

list.forEach(b->{
		System.out.println(Arrays.toString(b));
	});

当然这一种遍历方式也是可取的

for (Object[] objects : list) {
	System.out.println(Arrays.toString(objects));
}

如果Book实体类中含有categories的set集合,toString方法中不要给它进行遍历,否则会报错! java.lang.StackOverflowError

2、实现效果

查询返回List
在这里插入图片描述
查询单个
在这里插入图片描述
Object[ ]
在这里插入图片描述

Map集合
在这里插入图片描述
这里我为了便于结果的阅读,加上了别名!

构造方法
在这里插入图片描述
命名参数
在这里插入图片描述
聚合函数
在这里插入图片描述
联接查询

这里和上面使用的不是同一个实体类,使用单独粘贴出来!主表和从表之间有字段关联着的,比较适合做联表查询!

package com.wangqiuping.dao;

import java.util.Arrays;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import com.wangqiuping.util.SessionFactoryUtils;

public class Test {

	Session  session=null;
	Transaction ts=null;
	
	@Before
	public void setUp() throws Exception {
		session=SessionFactoryUtils.openSession();
	    Transaction  ts=session.beginTransaction();
	}

	@After
	public void tearDown() throws Exception {
		ts.commit();
		SessionFactoryUtils.closeSession();
	}

	@org.junit.Test
	public void test() {
		//联查
	    String hql = "select t1.orderNo,t2.quantity from Order t1, OrderItem t2 where t1.orderId = t2.order.orderId";
		Query query = session.createQuery(hql);
		List<Object[]> list=query.list();
		list.forEach(b->{
			System.out.println(Arrays.toString(b));
		});
	}
}

联表查询的效果
在这里插入图片描述

总结

hql这种语言,适用于一定的场景,但是不适用于所有的应用场景,大部分应用场景中还是使用sql语言会比较多,所以根据学习的需求进行取舍就好,同时也要学会区分hql和sql的不同!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值