Hibrenate提供了五种检索对象的方式
- 导航对象图检索方式:根据已经加载的对象导航到其他对象
- OID检索方式:按照对象的OID来检索对象
- HQL检索方式:使用面向对象的HQL查询语言
- QBC检索方式:使用QBC(Query by Criteria)API来检索对象
- 本地SQL检索方式:使用本地数据库的SQL查询语言
导航对象图检索方式:就是利用类与类之间的关系来检索对象,比如在论坛的开发中,帖子(page)与发帖人(owner)之间:
Page page = (Page)session.get(Page.class,1);
Owner own = page.getOwner();
这样就可以通过帖子找到发帖人。【注意:他们之间的关联关系为多对一】
OID检索方式:主要是指通过session的get(),load()方法来获取某条记录对应的对象.
Page page = (Page)session.load(page.class,id);
Page page = (Page)session.get(page.class,id);
HQL检索方式:面向对象的查询语言,HQL是使用最广的一种查询方式。它提供的功能也很丰富。
——在查询语句中设定各种查询条件
——支持投影查询,就是知查询对象的部分属性
——支持分页查询 、支持连接查询
——支持分组查询,允许使用 HAVING 和GROUP BY关键字
——提供内置聚集函数(sum(),min(),max())
——支持子查询,动态绑定参数
——能够调用用户定义的SQL函数或标准的SQL函数
通常的检索方式:
//绑定1 String sql = "from User as u where u.username=? and u.password=?";//定义检索语句 Query query = session.createQuery(sql);//创建查询接口 query.setString(0,"zhangsan"); query.setString(1,"123456");//动态绑定参数 /*--------------绑定2--------------*/
String sql = "from User as u where u.username=:name and u.password=:pass"; //定义检索语句 Query query = session.createQuery(sql);//创建查询接口 query.setString("name","zhangsan"); query.setString("pass","123456");//动态绑定参数
List list = query.list();//执行查询
/**
* hibernate的动态绑定参数机制依赖与JDBC中的PreparedStatement的预编译SQL语句的功能
* HQL参数绑定有俩种机制 ①按照参数位置【情况1】 ②按照参数名【情况2】
**/还有相关方法:
• setEntity (): 把参数与一个持久化类绑定• setParameter (): 绑定任意类型的参数 . 该方法的第三个参数显式指定 Hibernate 映射类型
Qurey接口支持方法链编程风格。【Query query = session.createQuery(sql).setString().setString.setInteger().list()】
HQL支持分页查询
– setFirstResult ( int firstResult ): 设定从哪一个对象开始检索 , 参数 firstResult 表示这个对象在查询结果中的索引位置 , 索引位置的起始值为 0. 默认情况下 ,Query 从查询结果中的第一个对象开始检索– setMaxResults ( int maxResults ): 设定一次最多检索出的对象的数目 . 在默认情况下 ,Query 和 Criteria 接口检索出查询结果中所有的对象
QBC检索方式:HQL检索方式需要定义基于字符串形式的HQL查询语句,QBC提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成。它支持动态的生成查询语句。
Criteria criteria = session.createCriteria(Page.class); Criterion criterion = Expression.like("name",""T%); Criterion criterion1 = Expression.eq("date",new Date("2016-12-12")); criteria = criteria.add(criterion);
List result = criteria.list();criteria = criteria.add(criterion1);
本地sql检索方式
示例代码:
Query query = session.createSQLQuery("select {c.*} from CUSTOMER as cwhere c.NAME like :customerName andc.AGE=:customerAge");
query.setString("customerName", "Test"); query.setInteger("customerAge", 21);
List result = query.list();