hibernate之hql语句

  1. 什么是hql
    HQL是Hibernate Query Language的缩写
    首先 定义一直要用的方法
    代码如下
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();
	}

简单说下hql的应用
一、查询所有

/**
	 * 查询所有
	 * 这里的Book指的是实体类的名字,不是数据库表名,名字一定要正确,区分大小写
	 */
	@Test
	public void testList1() {
		String hql="from Book";
		Query query = session.createQuery(hql);
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println(book);
		}
	}

二、查询单个列或者多列

/**
	 * 查一列
	 * 这里需要注意的是返回的是list的String集合,而不是Query
	 */
	@Test
	public void testList2() {
		String hql="select bookname from Book";
	 List<String> list = session.createQuery(hql).list();
	 for (String s: list) {
		System.out.println(s);
	}}
	
	/**
	 * 查询多列
	 * 对query结果集的处理返回一个list的Object的集合
	 */
	@Test
	public void testList3() {
		String hql="select bookid,bookname from  Book";
		Query query = session.createQuery(hql);
		List<Object[]> list = query.list();
		for (Object[] book : list) {
			System.out.println(Arrays.toString(book));
		}
	}

三、map接收

/**
	 * 处理方式4:通过hibernate函数map去处理
	 * map不区分大小写
	 */
	@Test
	public void testList4() {
		String hql="select new map(bookid,bookname) from  Book";
		Query query = session.createQuery(hql);
		List<Map> list = query.list();
		for (Map book : list) {
			System.out.println(book);
		}
	}

这里与查询多列进行对比
1、查询多列的输出结果
在这里插入图片描述
2、map接收的查询结果
在这里插入图片描述
四、通过构造器

/**
	 * 通过构造方法进行查询
	 * 这里需要注意定义一个有参的构造器
	 * public Book(Integer bookid, String bookname) {
		super();
		this.bookid = bookid;
		this.bookname = bookname;
	}
	 *No default constructor for entity出现这个错误是因为你没有定义一个无参的构造器
	 
	 /
	@Test
	public void testList5() {
		String hql="select new Book(bookid,bookname) from  Book";
		Query query = session.createQuery(hql);
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println(book);
		}
	}

五、命名参数

/**
	 * 讲解hibernate中的占位符问题
	 * 5版本以后弃用“?”
	 * 
	 */
	@Test
	public void testList6() {
		String hql="from Book where bookid in(:bid)";
		Query query = session.createQuery(hql);
//		List<Integer> bid=new ArrayList<Integer>();
//		bid.add(2);
//		bid.add(3);
//		query.setParameter("bid", 2);
//		query.setParameterList("bid", bid);
//		Book book = (Book) query.getSingleResult();
//		System.out.println(book);
		query.setParameterList("bid", new Integer[] {2,3});
		List list = query.list();
		for (Object object : list) {
			System.out.println(object);
		}
	}

输出结果

Hibernate:
select
book0_.book_id as book_id1_0_,
book0_.book_name as book_nam2_0_,
book0_.price as price3_0_
from
t_hibernate_book book0_
where
book0_.book_id in (
? , ?
)
Book [bookid=2, bookname=红楼梦, price=50.0]
Book [bookid=3, bookname=水浒, price=50.0]
六、hql的连表查询

/**
	 * 连表查询
	 * 
	 */
	@Test
	public void testList7() {
		String hql="select o.orderNo,oi.productId from Order o,OrderItem oi where o=oi.order";
		List<Object[]> list = session.createQuery(hql).list();
		for (Object[] object : list) {
			System.out.println(Arrays.toString(object));
		}
		
	} 

七、分页


	/**
	 * 分页
	 */
	@Test
	public void testList9() {
		String hql="from Book";
		Query query = session.createQuery(hql);
		int page=2;
		int ofset=3;
		query.setFirstResult((page-1)*ofset);
		query.setMaxResults(ofset);
		List<Book> list = query.list();
		for (Book book : list) {
			System.out.println(book);
		}
		
  1. hql和sql区别/异同
    HQL SQL
    类名/属性 表名/列名
    区分大小写,关键字不区分大小写 不区分大小写
    别名 别名
    ?,从下标0开始计算位置(hibernate5之后不支持) ?,从顺序1开始计算位置
    :命名参数 不支持:命名参数
    面向对象的查询语言 面向结构查询语言
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值