Hibernate之HQL

本文详细介绍了Hibernate的HQL查询语言,包括HQL与SQL的区别、HQL的基础语法、处理结果集的方法,以及如何使用HQL进行分页、聚合函数操作和连接查询等。通过示例代码展示了HQL在实际应用中的各种用法,如查询单个列段、多个列段、构造新对象等。
摘要由CSDN通过智能技术生成

一、HQL入门

1、HQL的含义:

        HQL是Hibernate Query Language(专属于hibernate框架的一个查询语言)的缩写 

2. hql和sql区别/异同


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

例:  sql:select name from t_mvc_book where name like ?;

         hql:from Book where name like :bookName

3、处理返回的结果集 


    1.单个对象—— select没有逗号 
    2.Object[]—— b.bookId, b.bookName 
    3.Map——new Map(b.bookId as bid, b.bookName as bname) 
    4.new  构造方法(attr1,attr2) String/long——new Book(b.bookId, b.price)            单个列段

二.hql语法基础 

 hql的返回值:对象、object[](数组)、集合、String/long(字符串)

第一步: HqlTest

package com.pjl.three.hql;

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.pjl.two.entity.Book;
import com.pjl.two.util.SessionFactoryUtil;



public class HqlTest {
	private Session session;
	private Transaction transaction;
	
	@Before
	public void before() {
		session = SessionFactoryUtil.getSession();
		transaction = session.beginTransaction();
	}
	
	@After
	public void after() {
		transaction.commit();
		session.close();
	}
	
	/**
	 * 返回对象(多个)
	 */
	@Test
	public void testList1() {
		Query query = session.createQuery("from Book");
		List<Book> list = query.list();
		for (Book b : list) {
			System.out.println(b);
		}
	}
	
	/**
	 * 返回单个列段,用字符串就可以接受
	 */
	@Test
	public void testList2() {
		Query query = session.createQuery("select b.bookName as ss from Book b");
		List<String> list = query.list();
		for (String b : list) {
			System.out.println(b);
		}
	}
	
	/**
	 * 查两个列段及以上,默认返回的是Object【】
	 */
	@Test
	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<Map> 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<Book> 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<Integer> params = new ArrayList<Integer>();
//		params.add(1);
//		params.add(2);
//		params.add(4);
//		query.setParameterLis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值