分类:
Hibernate共分为三种查询:HQL,Criteria,原生SQL
HQL查询:(适合不复杂的多表查询)
Hibernate自创操作数据库的查询语言,属于面向对象的查询语言.
HQL不会出现任何数据库相关的信息
1.基本查询:
@Test
public void testHqlBase(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//操作---
// hql语句
String hql = "from Customer";
// 根据hql语句创建查询对象
Query query = session.createQuery(hql);
// 获得多个查询结果
List<Customer> list = query.list();
System.out.println(list);
//提交
tx.commit();
// 关闭资源
session.close();
}
使用createQuery()来创建查询对象
这里的hql语句与sql语句不同,hql语句本是这样的:select * from Customer,但是因为是查询*,所以可以省略select *,然后from后的并非数据库表,因为hql是面向对象的,所以其实这个Customer是实体类.请看上面标红的那句话!
然后执行hql语句是使用的session的createQuery(hql),获得多个数据使用list(),获得单个数据使用uniqueResult()方法
2.条件查询
@Test
public void testHql1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//操作---
// hql语句
//Customer:实体类,cust_id:实体类属性
String hql = "from Customer where cust_id = 1";
// 根据hql语句创建查询对象
Query query = session.createQuery(hql);
// 获得多个查询结果
Customer u = (Customer) query.uniqueResult();
System.out.println(u);
//提交
tx.commit();
// 关闭资源
session.close();
}
注意hql语句中没有数据库的东西就可以,
当然,我们也可以使用占位符?
于是就要用到setParameter()方法来给占位符赋值了
类似这样:
如果在项目中?的顺序总是改变,这时候我们使用?作为占位符就不太好用了因此,hibernate给我们准备了另外一种自定义占位符
这里故意写了ccc为的就是说明这是自定义的,而我们一般规范的写cust_id,但其实写什么都可以的!
3.分页查询
@Test
public void testHql2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//操作---
// hql语句
//Customer:实体类,cust_id:实体类属性
String hql = "from Customer";
// 根据hql语句创建查询对象
Query query = session.createQuery(hql);
// 设置第一个占位符?
query.setFirstResult(0);
query.setMaxResults(1);
// 获得多个查询结果
List<Customer> list = query.list();
System.out.println(list);
//提交
tx.commit();
// 关闭资源
session.close();
}
这里要注意hql语句中没有limit,而是使用了setFirstResult()与setMaxResult()来设置limit?,?的两个占位符
Criteria查询:(适合单表条件查询)
hibernate自创,彻底无语句面向对象查询.
1.基本查询
@Test
public void testCriteria1() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 创建Criteria查询对象
Criteria c = session.createCriteria(Customer.class);
List<Customer> list = c.list();
System.out.println(list);
// 提交
tx.commit();
//关闭
session.close();
}
使用createCriteria()创建Criteria查询对象.
因为是,无语句,所以也就没有了hql的什么form class了,所以我们在创建了查询对象时就指定返回的是那个实体类.
2.条件查询
@Test
public void testCriteria2() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 创建Criteria查询对象
Criteria c = session.createCriteria(Customer.class);
// 添加查询参数
c.add(Restrictions.eq("cust_id", 1l));
// 获得查询结果
Customer r = (Customer) c.uniqueResult();
System.out.println(r);
// 提交
tx.commit();
//关闭
session.close();
}
条件查询,这里使用了一个Restrictions类提供众多的方法,比如isNull()等
3.分页查询
@Test
public void testCriteria3() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 创建Criteria查询对象
Criteria c = session.createCriteria(Customer.class);
c.setFirstResult(0);
c.setMaxResults(1);
List<Customer> list = c.list();
System.out.println(list);
// 提交
tx.commit();
//关闭
session.close();
}
这里与Hql差不多,如果我们要分页的话还要知道总行数,这里就用到了聚合函数获得总行数的需求
使用如下代码,设置查询的聚合函数:
// 创建Criteria查询对象
Criteria c = session.createCriteria(Customer.class);
c.setProjection(Projections.rowCount());
Long count = (Long) c.uniqueResult();
原生SQL
1.基本查询
@Test
public void testSql() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String sql = "select * from cst_customer";
SQLQuery query = session.createSQLQuery(sql);
List<Object[]> list = query.list();
for(Object[] objs : list){
System.out.println(Arrays.toString(objs));
}
//关闭资源
session.close();
}
这个应该很熟悉,只是生成查询对象的方法是createSQLQuery(),然后查询的每一行是一个Object[]数组,如果我们先用对象Customer代替Object[]请看下边,使用addEntity(class)
2.条件查询
@Test
public void testSql2() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String sql = "select * from cst_customer where cust_id = ?";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Customer.class);
query.setParameter(0, 1);
List<Customer> list = query.list();
System.out.println(list);
//关闭资源
session.close();
}
其中,因为使用了addEntity(class)方法,所以查询结果返回的不是Object[]而是Class实体类Customer,这里设置参数用到的setParameter()之前也用过.
3.分页查询
@Test
public void testSql3() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String sql = "select * from cst_customer limit ?,?";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Customer.class);
query.setParameter(0, 0);
query.setParameter(1, 1);
List<Customer> list = query.list();
System.out.println(list);
//关闭资源
session.close();
}