hibernate之HQL

本文详细介绍了在Hibernate中使用HQL进行对象查询、Map结果转换、构造函数应用、占位符、连接查询、聚合函数以及分页的方法。同时提及了如何处理SQL替代HQL的情况和提供一套前端开发学习资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public void testList3() {

Query query = session.createQuery(“select b.bookId,b.bookName as ss from Book b”);

List<Object[]> list = query.list();

for (Object[] b : list) {

System.out.println(Arrays.toString(b));

}

}

/**

  • 注意map是函数,所以不区分大小写,返回的是map集合

*/

@Test

public void testList4() {

Query query = session.createQuery(“select new mAp(b.bookId,b.bookName) from Book b”);

List list = query.list();

for (Map b : list) {

System.out.println(b);

}

}

/**

  • 查两个列段及以上,也可返回对象,前提是有对应的构造函数

*/

@Test

public void testList5() {

Query query = session.createQuery(“select new Book(b.bookId,b.bookName) from Book b”);

List list = query.list();

for (Book b : list) {

System.out.println(b);

}

}

/**

  • HQL语句支持占位符

*/

@Test

public void testList6() {

// Query query = session.createQuery(“from Book where bookId = :bookId”);

// query.setParameter(“bookId”, 1);

// Book b = (Book) query.getSingleResult();

// System.out.println(b);

Query query = session.createQuery(“from Book where bookId in (:bookIds)”);

query.setParameterList(“bookIds”, new Integer[] {1,2,4});

// List params = new ArrayList();

// params.add(1);

// params.add(2);

// params.add(4);

// query.setParameterList(“bookIds”, params);

List list = query.list();

for (Book b : list) {

System.out.println(b);

}

}

/**

  • HQL支持连接查询

*/

@Test

public void testList7() {

Query query = session.createQuery(“select o.orderNo,oi.quantity from Order o,OrderItem oi where o = oi.order”);

List<Object[]> list = query.list();

for (Object[] b : list) {

System.out.println(Arrays.toString(b));

}

}

/**

  • HQL支持聚合函数

*/

@Test

public void testList8() {

Query query = session.createQuery(“select count(*) from Book”);

Long singleResult = (Long) query.getSingleResult();

System.out.println(singleResult);

}

/**

  • HQL分页

*/

@Test

public void testList9() {

Query query = session.createQuery(“from Book”);

query.setFirstResult(2);

query.setMaxResults(3);

List list = query.list();

for (Book b : list) {

System.out.println(b);

}

}

}

1,hibernate 处理返回的结果集

1. 单个对象

select没有逗号

2 .Object[]

b.bookId, b.bookName

3. Map

new Map(b.bookId as bid, b.bookName as bname)

4. new 构造方法(attr1,attr2)

new Book(b.bookId, b.price)

单个列段

2、 hql中使用占位符

① 、?占位符

从下标0开始计算位置hibernate5之后不再支持?占位符

②、:命名参数

3、 连接查询

4、 聚合函数

sum、 avg、max、min、count

5、 hql分页

int page = 2;// 页码:page

int row = 10;// 每页行数:rows

query.setFirstResult((page - 1) * row);// 设置起始记录下标

query.setMaxResults(row);// 设置返回的最大结果集

3、BaseDAO

hql实现不了的功能,可以考虑使用原生sql

/**

* 通用的参数设值方法

*

* @param map

*            参数键值对集合

* @param query

*            预定义处理的hql对象

*/

public void setParam(Map<String, Object> map, Query query) {

if (map != null && map.size() > 0) {

Object value = null;

Set<Entry<String, Object>> entrySet = map.entrySet();

for (Entry<String, Object> entry : entrySet) {

// 例子的圣墟,但是有的时候它并不是单纯的字符串,可能是数组比如爱好,也可能是集合

value = entry.getValue();

if (value instanceof Object[]) {

query.setParameterList(entry.getKey(), (Object[]) value);

} else if (value instanceof Collection) {

query.setParameterList(entry.getKey(), (Collection) value);

} else {

query.setParameter(entry.getKey(), value);

}

}

}

}

由于hql的语句有几种不同的写法,为了统一拼接hql,进行以下操作

public String getCountHql(String hql) {

// hql = “from Book where bookName like :bookName”

// * hql = “select * from new Book(bid,bookName) where bookName like :bookName”

int index = hql.toUpperCase().indexOf(“FROM”);

return "select count(*) " + hql.substring(index);

}

有时会大小写不统一,所以首先将语句全部转化成大写,再根据FROM进行定位,找到FROM的下标进行截取,再拼接

通用的查询方法

/**

* 通用查询方法

* @param session

* @param map

* @param hql

* @param pageBean

* @return

*/

public List executeQuery(Session session,Map<String, Object> map,String hql,PageBean pageBean) {

List list = null;

if(pageBean != null && pageBean.isPagination()) {

String countHql = getCountHql(hql);

Query countQuery = session.createQuery(countHql);

this.setParam(map, countQuery);

pageBean.setTotal(countQuery.getSingleResult().toString());

Query query = session.createQuery(hql);

//            给预定义hql语句执行对象中的参数赋值,有多少赋值多少

this.setParam(map, query);

query.setFirstResult(pageBean.getStartIndex());

query.setMaxResults(pageBean.getRows());

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

最后

今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

最后

今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

资料领取方式:戳这里前往获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值