Hibernate查询和事务的应用

 

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查询

常用的如下(个人释意):

  1. or() 或者
  2. And() 并列,连接
  3. Equal()等于
  4. notEqual 不等于
  5. like() 模糊查询
  6. Isnull() 为空
  7. In()  
  8. gt()大于
  9. ge()大于等于
  10. lt() 小于
  11. 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>

猜你喜欢

转载自blog.csdn.net/qq_40437152/article/details/81087454