一 综述:
Criteria query 通过面向对象化的设计,将数据查询封装为一个对象,可以看作传统sql语句的封装。Criteria只是一
个查询容器,具体的查询条件通过add方法添加到实例中。下面为一个具体的实例。
Criteria criteria = session.createCriteria(Role.class) ;
criteria.add(Expression.eq("role_name" , "duming1")) ;
List list = criteria.list() ;
Iterator iter = list.iterator() ;
while(iter.hasNext()){
Role role = (Role) iter.next() ;
System.out.println("id:" + role.getRole_id());
System.out.println("name:" + role.getRole_name());
}
二 hql 语句
在实际项目中使用最多的是hql查询语句。
1 实体查询
String hql = "from Role " ;
Query query = session.createQuery(hql) ;
List roles = query.list() ;
Iterator iter = roles.iterator() ;
while(iter.hasNext()){
Role role = (Role) iter.next() ;
System.out.println("id:" + role.getRole_id());
System.out.println("name:" + role.getRole_name());
}
注意: from Role , Role是一个vo类,而不是一个存在的数据库中的table 。
(2) 关于继承
如果查询Base类,而SubA ,和SubB都是Base的子类。那么查询Base,结果就会出现SubA 和SubB的信息。
显然如果查询java.lang.Object 。那么就会查询出所有类的信息。
(3)条件查询语句
String hql = "from Role as role where role.role_name ='duming1'" ;
Query query = session.createQuery(hql) ;
List roles = query.list() ;
Iterator iter = roles.iterator() ;
while(iter.hasNext()){
Role role = (Role) iter.next() ;
System.out.println("role_id" + role.getRole_id());
System.out.println("role_name:"+ role.getRole_name());
}
(4) 查询某一个单独属性
String hql = "select role.role_name from Role role" ;
Query query = session.createQuery(hql) ;
List roles = query.list() ;
数组中的每个元素都是String的
Iterator iter = roles.iterator() ;
while(iter.hasNext()){
String role = (String) iter.next() ;
System.out.println("role_id" + role);
}
(5) 若获取多个属性
String hql = "select role.role_name , role_id from Role role" ;
Query query = session.createQuery(hql) ;
List roles = query.list() ;
Iterator iter = roles.iterator() ;
while(iter.hasNext()){
Object[] results = (Object[])iter.next() ;
容器中得到的是 对象数组
System.out.println(results[0]);
System.out.println(results[1]);
}
(6)对获取多个属性进行封装
String hql = "select new Role ( role_id , role.role_name ) from Role role" ;
//上面的Role对查询的数据进行了封装 ,但是在vo类中,必须有相关的构造函数
Query query = session.createQuery(hql) ;
List roles = query.list() ;
Iterator iter = roles.iterator() ;
while(iter.hasNext()){
Role result = (Role)iter.next() ;
System.out.println(result.getRole_id());
System.out.println(result.getRole_name());
}
2 实体的查询和更新
(1) 关于实体类的更新
Transaction tc = session.beginTransaction() ;
String hql = "update Role set role_name = 'duming' where role_id = 1" ;
Query query = session.createQuery(hql) ;
query.executeUpdate() ;
tc.commit() ;
(2) 关于实体类的删除
Transaction tc = session.beginTransaction() ;
String hql = "delete Role where role_id = 1" ;
Query query = session.createQuery(hql) ;
query.executeUpdate() ;
tc.commit() ;
3 分组与排序
同sql种的方式一样,无需解释
4 参数绑定
即要求查询的参数为变量。
(1)通过"?"占位符
String hql = "from Role role where role.role_id = ?" ;
Query query = session.createQuery(hql) ;
query.setInteger(0, 1) ;
List roles = query.list() ;
Iterator iter = roles.iterator() ;
while(iter.hasNext()){
Role result = (Role) iter.next() ;
System.out.println("name" + result.getRole_name() );
}
(2) 通过引用占位符
String hql = "from Role where role_name =:name" ;
//此处为引用占位符
Query query = session.createQuery(hql) ;
query.setParameter("name", "duming2") ;
List roles = query.list() ;
Iterator iter = roles.iterator() ;
while(iter.hasNext()){
Role result = (Role) iter.next() ;
System.out.println("id" + result.getRole_id() );
}
5 联合查询
(1) 内联查询
内联返回所有满足关联条件的组合
String hql = "from Role role inner join fetch role.groups" ;
Query query = session.createQuery(hql) ;
List roles = query.list() ;
Iterator iter = roles.iterator() ;
while(iter.hasNext()){
Role result = (Role) iter.next() ;
System.out.println("id" + result.getRole_id() );
Set <Gr> groups = result.getGroups() ;
Iterator iter1 = groups.iterator() ;
while(iter1.hasNext()){
Gr gr = (Gr)iter1.next() ;
System.out.println("" + gr.getGroup_name() );
}
}
如果忽略了fetch,那么返回的值,为一个Object[] 数组,
(2) 左外联查询
String hql = "from Role role left join fetch role.groups" ;
包含了左侧表的全部信息,右边的信息若不存在则为空, 即NULL。
(3) 右外联查询
和左外联相反。
(4) 子查询
from Role role where (select count(*) from role.groups) > 2
(5) 数据加载方式
a )即时加载
当实体加载完毕后立即加载相关数据
b) 延迟加载
实体加载后,有关数据并不是立即获取,而是关联数据第一次访问后才进行加载。
c) 预先加载
实体与相关联数据同时读取,实体与相关联的数据通过outer join 语句相联系。
d) 批量加载
对即时加载和延迟加载可以采用批量加载进行优化。