hibernate之hql语句

xiaoxiao2025-04-26  11

什么是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); } hql和sql区别/异同 HQL SQL 类名/属性 表名/列名 区分大小写,关键字不区分大小写 不区分大小写 别名 别名 ?,从下标0开始计算位置(hibernate5之后不支持) ?,从顺序1开始计算位置 :命名参数 不支持:命名参数 面向对象的查询语言 面向结构查询语言
转载请注明原文地址: https://www.6miu.com/read-5029206.html

最新回复(0)