Hibernate 检索方式
- 类级别检索:当前对象所有属性值。例如:Customer自己数据
- 关联级别检索:当前对象关联对象数据。例如:Customer 关联 Order 数据
1 检索概述
- 通过OID检索
get() 立即查询,如果没有返回null。
load() 默认延迟检查,如果没有结果抛异常。
使用以上两个方法进行查询,结果都为持久态对象,持久对象就在一级缓存中。
对象导航图 : 通过持久对象自动获得关联对象。
例如:customer.getOrderSet().size()原始SQL语句
session.createSQLQuery("sql语句") ,理论进行优化,提供性能。建议不用。
QBC ,hibernate 提供 纯面向对象查询语句,Query By Criteria,弱化。
HQL ,hibernate 提供面向对象查询语句。类似SQL语句(重点)
HQL 使用对象和对象属性,SQL语句使用表名和字段名称。
对象和属性区分大小写的。表名和字段名称不区分大小写。
1 类级别
类级别:查询当前类的所有内容,只查询一次。优化指的是查询时机优化,让空闲时间服务器做出其他处理。
session.get(Customer.class ,oid) 通过OID立即检索(查询),如果数据不存在返回null。
session.load(Customer.class , oid ) 默认通过OID延迟检索,如果数据不存在将抛异常。
1 Hibernate 加载配制文件 获取session
public class H3Utils {
//提供一个工厂 (链式操作)
private static SessionFactory factory =
new Configuration()
.configure("android/longs/study/config/hibernate.cfg.xml")
.buildSessionFactory();
/**
* 获得线程绑定的session
* @return
*/
public static Session getCurrentSession(){
return factory.getCurrentSession();
}
}
1 查询所有
//HQL 方式
public void queryAllFunction1(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//HQL
Query query = session.createQuery("from Customer");
//获取
List<Customer> allCustomer = query.list();
session.getTransaction().commit();
session.close();
}
//HQL 方式
public void queryAllFunction2(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//HQL 可以使用别名 , 这里的别名为 c ,可以使用别名来代替 select 中的 *
Query query = session.createQuery("select c from Customer as c");
//获取
List<Customer> allCustomer = query.list();
session.getTransaction().commit();
session.close();
}
//sql 语句方式
public void queryAllFunction3(){
Session session = factory.openSession();
session.beginTransaction();
//2 SQL
SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer");
// * 必须设置查询结果封装到那个对象中
sqlQuery.addEntity(Customer.class);
//获取数据
List<Customer> allCustomer = sqlQuery.list();
session.getTransaction().commit();
session.close();
}
//QBC方式
public void queryAllFunction4(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//QBC
Criteria criteria = session.createCriteria(Customer.class);
//获取数据
List<Customer> allCustomer = criteria.list();
session.getTransaction().commit();
session.close();
}
2 通过 id 来查询单个数据
- hql 方式根据指定id来查询
public void queryCuseromeFromIdToHQL(int id) {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//创建 hql
Customer customer =(Customer) session.createQuery("from Customer c where c.cid = 1").uniqueResult();
session.getTransaction().commit();
session.close();
}
- sql方式根据指定id来查询
public void queryCuseromeFromIdToSQL(int id) {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//构建sql
String sql = "select * from t_customer c where c.cid= "+id;
//通过 sql 来查询对应的数据
Customer customer =
(Customer) session
.createSQLQuery(sql)//执行sql
.addEntity(Customer.class)//封装数据的实体类型
.uniqueResult();//获取一个对象
session.getTransaction().commit();
session.close();
}
- QBC方式根据指定id来查询
public void queryCuseromeFromIdToQBC(int id) {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//QBC
Customer customer =
(Customer) session
.createCriteria(Customer.class)
.add(Restrictions.eq("cid", 1)) //添加约束
.uniqueResult();
session.getTransaction().commit();
session.close();
}
3 排序查询
- hql 方式查询排序
public void queryAllDescFunctonForHQL(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//构建HQL语句
String hql = "from Customer c order by c.cid desc";
// 1 hql , 格式: order by 属性名 [asc]|desc
List<Customer> allCustomer =
session.createQuery(hql).list();
session.getTransaction().commit();
}
- sql方式查询排序
public void queryAllDescFunctonForSql(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//构建sql 语句
String sql = "select * from t_customer order by cid desc";
// 2 sql
List<Customer> allCustomer =
session.createSQLQuery(sql)
.addEntity(Customer.class)
.list();
session.getTransaction().commit();
}
- QBC方式方式查询排序
public void queryAllDescFunctonForQBC(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
// 3 qbc 注意Order
List<Customer> allCustomer =
session.createCriteria(Customer.class)
.addOrder(org.hibernate.criterion.Order.desc("cid"))
.list();
session.getTransaction().commit();
}
4 查询部分内容
- hql 方式查询部分内容
//通过hql方式来查询 部分内容
public void queryPartForHql() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//构建语句
String hql = "select new Customer(cid,name) from Customer";
/*
* hql 查询,默认将查询结果封装到 Object[] 中,但我们需要封装指定对象中
* 可以 提供构造方法,将查询结果通过构造方法直接创建对象。
* 投影查询,查询结果为脱管态
* 注意对应的类 Customer 中要有对应的 构造
*/
List<Customer> allCustomer = session.createQuery(hql).list();
session.getTransaction().commit();
session.close();
}
- sql方式查询部分内容
//通过SQL方式来查询 部分内容
public void queryPartForSql() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//构建语句
String sql = "select cid,name from t_customer";
//查询
List<Customer> allCustomer = session.createSQLQuery(sql).addEntity(Customer.class).list();
session.getTransaction().commit();
}
- QBC方式查询部分内容
//通过QBC方式来查询 部分内容
public void queryPartForQBC() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
List<Customer> allCustomer =
session.createCriteria(Customer.class)//设置数据封装的类
.setProjection(
Projections.projectionList()
.add(Projections.alias(Projections.property("cid"), "cid"))//添加 查询的部分
.add(Projections.alias(Projections.property("name"), "name"))//添加 查询的部分
)
.setResultTransformer( new AliasToBeanResultTransformer(Customer.class))
.list();
session.getTransaction().commit();
}
5 分页查询
- hql 方式分页查询
//通过 HQL 分页查询
public void queryPageHql() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//1 hql , 不能手动设置limit
List<Customer> allCustomer = session.createQuery("from Customer")
.setFirstResult(0)//查询的页数
.setMaxResults(2)//每页查询的个数
.list();
session.getTransaction().commit();
}
- sql方式分页查询
//通过 sql 分页查询
public void queryPageSQL() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//构建 语句
String sql1 = "select * from t_customer ";
List<Customer> allCustomer = session.createSQLQuery(sql1)
.addEntity(Customer.class)//设置数据封装的对象
.setFirstResult(0)//设置开始查询的页数
.setMaxResults(2)//设置每页可以查询的数据个数
.list();
// 这里可以使用 limit 方式 来进行查询
String sql2 = "select * from t_customer limit 0,2";
List<Customer> allCustomer2 = session.createSQLQuery(sql2)
.addEntity(Customer.class)
.list();
session.getTransaction().commit();
session.close();
}
- QBC方式分页查询
//通过 QBC 分页查询
public void queryPageQBC() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
List<Customer> allCustomer = session.createCriteria(Customer.class)
.setFirstResult(0)//设置开始查询的页数
.setMaxResults(2)//设置每页查询的元素的个数
.list();
session.getTransaction().commit();
session.close();
}
6 绑定参数进行查询
- hql 方式绑定参数查询
//Hql 绑定参数查询
public void queryParamForHql(int num) {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//占位符方式
String hql1 = "from Customer c where c.cid = ? ";
Customer customer = (Customer) session.createQuery(hql1)
.setInteger(0, num)//第0个参数 值为num
.uniqueResult();
//别名方式
String hql2 = "from Customer c where c.cid = :xx ";
Customer customer2 = (Customer) session.createQuery(hql1)
.setInteger("xx", num)//第0个参数 值为num
.uniqueResult();
session.getTransaction().commit();
}
- sql方式绑定参数查询
//SQL绑定参数查询
public void queryParamForSql(int id) {
Session session = factory.openSession();
session.beginTransaction();
//构建sql
String sql = "select * from t_customer c where c.cid= "+id;
//通过 sql 来查询对应的数据
Customer customer =
(Customer) session
.createSQLQuery(sql)//执行sql
.addEntity(Customer.class)//封装数据的实体类型
.uniqueResult();//获取一个对象
session.getTransaction().commit();
}
- QBC方式绑定参数查询
//QBC绑定参数查询
public void queryParamForQBC() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//QBC
Customer customer =
(Customer) session
.createCriteria(Customer.class)
.add(Restrictions.eq("cid", 1)) //添加约束
.uniqueResult();
session.getTransaction().commit();
session.close();
session.getTransaction().commit();
}
7 聚合函数
public void demo07(){
Session session = factory.openSession();
session.beginTransaction();
//1 hql
// * uniqueResult() 如果查询结果数大于1抛异常,如果是1返回结果,如果0返回null
//HQL 方式一
Object objCount = session.createQuery("select count(*) from Customer").uniqueResult();
//HQL 方式二
Long numCount = (Long)session.createQuery("select count(c) from Customer c").uniqueResult();
//2 sql
BigInteger sqlCount = (BigInteger) session.createSQLQuery("select count(cid) from t_customer").uniqueResult();
//3 qbc
Long numObj = (Long)session.createCriteria(Customer.class)
.setProjection(
Projections.projectionList()
.add(Projections.rowCount())
)
.uniqueResult();
//打印
int num = numObj.intValue();
System.out.println(num);
session.getTransaction().commit();
session.close();
}