hql语句和sql语句不同,当我们使用hql语句查询时,要把SQL语句的表写成 实体类的类名,字段写成实体类的属性
- 基本查询:查出数据库中所有的数据
代码如下:
//基本查询,查询所有的实体@Testpublic void test1() {//获取当前线程的sessionSession s = HibernateUtils.getCurrentSession();Transaction t = s.beginTransaction();Query query = s.createQuery("from Customer");List list = query.list();for(Object o : list) {System.out.println(o);}t.commit();}
我们应当注意这段代码:
Query query = s.createQuery("from Customer");
执行的hql语句是:from Customer
但如果我们使用sql,语句是:
select * from cst_customer(cst_customer是我数据库中的表名)
其中我们可以发现,使用hql只要把sql的表名换成实体类名就可以了,而且 select * 都可以不要
- 条件查询:按条件查询出数据库的数据
代码如下:
//条件查询@Testpublic void test2() {Session s = HibernateUtils.getCurrentSession();Transaction t = s.beginTransaction();//Query query = s.createQuery("from Customer where custName = ?");//取别名Query query = s.createQuery("from Customer where custName = :custName");//query.setString(0, "23");//query.setParameter(0, "23");query.setParameter("custName", "23");List list = query.list();for(Object o : list) {System.out.println(o);}t.commit();}
当我们使用条件查询时,我们不仅要把表名换成实体类,还要把数据库的列名换成属性名:
from Customer where custName = ?
然后使用下面代码设置参数:
query.setString(0, "23");
可以发现我把这些代码注释掉了,这些方法不够具体,我们可以使用别名设置参数,如下代码
from Customer where custName = :custName
:后面的是别名,我们给参数赋值时可以使用一下代码就不用考虑具体参数的类型了
query.setParameter("custName", "23");
- 排序插叙:order by
//排序查询@Testpublic void test3() {Session s = HibernateUtils.getCurrentSession();Transaction t = s.beginTransaction();//根据custId排序Query query = s.createQuery("from Customer order by custId");List list = query.list();for(Object o : list) {System.out.println(o);}t.commit();}
- 分页查询:使用 order by ,在后面加上属性名就可以了
@Testpublic void test4() {Session s = HibernateUtils.getCurrentSession();Transaction t = s.beginTransaction();//查询全部数据,每页显示两条数据Query query = s.createQuery("from Customer");query.setFirstResult(0);query.setMaxResults(2);List list = query.list();for(Object o : list) {System.out.println(o);}t.commit();}
- 投影查询: 当我们在查询实体时,只需要部分实体的属性。并且希望返回的结果使用实体类封装,而不是Object[]
使用步骤:1、查询语句需要使用new关键字
2、在实体类中添加对应参数列表的构造函数
代码如下:
@Testpublic void test5() {Session s = HibernateUtils.getCurrentSession();Transaction t = s.beginTransaction();Query query = s.createQuery("select new domain.Customer(custId,custName) from Customer");List list = query.list();for(Object o : list) {System.out.println(o);}t.commit();}
在实体类中添加对应参数列表的构造函数,注意无参构造函数实体类中一定不能省
public Customer(Long custId, String custName) {this.custId = custId;this.custName = custName;}
注意在使用hql语句时,实体类要加上路径,因为在一个工程里,当有多个相同类名,就不知道创建那个实体类了