Hibernate查询
分为3种
1.hql查询
2.criteria查询
3.sql原生态查询
1.hql
hql是hibernate自己的语言
hql查询 不会出现表名字,表的字段名,只会是类名和类的属性名(在映射配置文件中是对应的)
例:查询表中数据,查询语句里面是类名
String hql = "from User";
Query query = session.createQuery(hql);
List<User>list = query.list();
占位符查询(可以理解为条件查询)
方式有两种:
1)?
String hql = "from User where name = ?";
Query query = session.createQuery(hql);
// 设置参数的时候,下标从0开始
query.setParameter(0,"王二");
List<User>list = query.list();
2):str
String hql = "from User where name = :name";
Query query = session.createQuery(hql);
// 设置参数的时候,下标从0开始
query.setParameter("name","王二");
List<User>list = query.list();
当类中字段较多时,第二种不用判断顺序问题,建议str与字段名一致
2.criteria查询
常用的如下(个人释意):
- or() 或者
- And() 并列,连接
- Equal()等于
- notEqual 不等于
- like() 模糊查询
- Isnull() 为空
- In()
- gt()大于
- ge()大于等于
- lt() 小于
- le() 小于等于
between() 在...之间
查询步骤:
使用session创建CriteriaBuilder工厂
通过工厂创建CriteriaQuery query
创建根元素
使用工厂对象增加条件(调用相应的方法)
将条件封装到query
将query传给session.createQuery得到查询结果
例:
CriteriaBuilder cb =session.getCriteriaBuilder();
CriteriaQuery<User>query = cb.createQuery(User.class);
Root<User>root = query.from(User.class);//设置根元素
//添加查询条件
Predicate predicate = cb.notEqual(root.get("name"),"李四");
Predicate predicate1 = cb.lt(root.get("balance"),5000);
//将条件封装到query
query.where(cb.and(predicate,predicate1));
List<User>list = session.createQuery(query).list();
3.sql原生态
这里初始下标是1
String sql = "select * from t_user where name=?";
NativeQuery nativeQuery = session.createNativeQuery(sql,User.class);
nativeQuery.setParameter(1,"王二");
List<User>list = nativeQuery.list();
hql 适用一些简单的查询
Criteria 只适用于单表查询
Sql 非常非常复杂的查询
使用哪种,看个人喜好
Hibernate中事务的应用
事务应该在service层开启和提交或者回滚
事务的开启需要 session
获得session有两种方式: openSession 每次打开都是一个新的,需手动关闭
getCurrentSession 线程绑定的session,事务结束自动关闭
注意:
Service层有session dao层也有session
这两个session必须保证是同一个session,这样事务的提交才能起作用。
Hibernate框架中所有增删改 都必须提交事务才能最终修改到数据库,所以在增删改操作中必须使用getCurrentSession
使用getCurrentSession必须在核心配置文件中设置:
<property name="hibernate.current_session_context_class">thread</property>