- 什么是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开始计算位置
:命名参数 不支持:命名参数
面向对象的查询语言 面向结构查询语言