hql语句和sql语句不同,当我们使用hql语句查询时,要把SQL语句的表写成 实体类的类名,字段写成实体类的属性
- 基本查询:查出数据库中所有的数据
代码如下:
//基本查询,查询所有的实体
@Test
public void test1() {
//获取当前线程的session
Session 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 * 都可以不要
- 条件查询:按条件查询出数据库的数据
代码如下:
//条件查询
@Test
public 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
//排序查询
@Test
public 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 ,在后面加上属性名就可以了
@Test
public 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、在实体类中添加对应参数列表的构造函数
代码如下:
@Test
public 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语句时,实体类要加上路径,因为在一个工程里,当有多个相同类名,就不知道创建那个实体类了