Hibernate!!Session

Session接口管理一个数据库的任务单元

session的用法如下:

Configuration  cfg = new AnnotationConfiguration().configure();
SessionFactory  sf = cfg.buildSessionFactory();
Session  session = sf.openSession();
//session开始事务
session.beginTransaction();
session.save(t); //save方法
//获得事务,并提交
session.getTransaction().commit();
session.close();
sf.close();

 

 

 

方法(CRUD):

  • save()
  • delete()
  • update()
  • saveOrUpdate()
  • load()
  • get()

 

delete():

在hibernate中,删除数据和添加、查询数据有所不同,因为要删除的对象并不在Session的管理之中,通过Session并不能对其进行删除操作,所以需要将要删除的对象转换为持久状态(persistent),使其处于Session的管理之内,然后再通过delete()方法进行删除。(必须要有ID)

 

 

查询数据

Session接口提供了两个加载数据的方法,get() 和 load() 方法,有区别:

get()返回实际对象,总会发出SQL语句。

load()返回对象的代理,只有在被调用的时候,hibernate才会发出SQL语句去查询对象。

(新知道的名词:动态代理)

load():

public   Object  load ( Class   entityClass ,  Serializable  id)  throws  HibernateException

entityClass : 持久化对象的类,

id : 标识

 

 

update():

  • 用来更新detached对象,更新完成后转为persistent对象
  • 更新transient对象会报错
  • 更新自己设定id 的 transient对象可以(数据库有对应的记录)
  • persistent状态的对象只要设定不同字段就会发生更新
  • 更新部分更改的字段
    a)映射文件的xml设定property 标签的 update属性, annotation设定@Column的 updatable属性,不过这种方法很少用,不灵活
    b)使用配置文件的xml中class里面的dynamic-update 属性, JPA1.0 Annotation没有对应的属性,hibernate扩展?(同一个Session可以,跨Session不可以,若想跨Session,在Java代码中可以加入一个merge()方法)
    c)使用HQL(EJBQL)  (建议)

 

saveOrUpdate():

 

clear():

  • 无论是load 还是 get ,都会首先查找缓存 (一级缓存) , 如果没有,才会去数据库查找 , 调用 clear()方法强制清楚 Session缓存

flush():

 

转载于:https://www.cnblogs.com/Mokaffe/p/4151567.html

### Hibernate 中实现不等于条件的查询 在 Hibernate 的 Criteria API 或 HQL (Hibernate Query Language) 中,可以通过多种方式实现 `!=` (不等于)条件的查询。 #### 使用 Criteria API 实现不等于条件查询 当使用 Criteria API 来构建查询时,可以利用 `CriteriaBuilder.notEqual()` 方法来设置字段与给定值之间的不相等关系。这允许开发者以面向对象的方式定义复杂的查询逻辑[^4]。 ```java // 创建Session并开启事务 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); // 获取CriteriaBuilder和创建CriteriaQuery CriteriaBuilder cb = session.getCriteriaBuilder(); CriteriaQuery<Student> cq = cb.createQuery(Student.class); Root<Student> root = cq.from(Student.class); // 设置where条件为id不等于指定值 cq.where(cb.notEqual(root.get("id"), 1L)); // 执行查询获取结果列表 List<Student> students = session.createQuery(cq).getResultList(); tx.commit(); session.close(); ``` 上述代码片段展示了如何基于实体类 `Student` 构建一个仅返回那些其 ID 字段不同于特定数值的对象集合的查询语句。 #### 使用 HQL 实现不等于条件查询 除了 Criteria API 外,在编写 HQL 查询字符串时也可以直接使用 SQL 风格的操作符 `<>` 表达不等于的关系: ```hql from Student s where s.id <> :studentId ``` 这里 `:studentId` 是一个命名参数占位符,实际执行前需绑定具体值: ```java Query query = session.createQuery(hqlString); query.setParameter("studentId", 1L); // 绑定参数 List results = query.list(); // 获取结果集 ``` 这种方式更加直观易懂,并且对于简单的查询来说非常方便[^2]。 #### 注意事项 - 当处理数据库中的 NULL 值时需要注意,因为某些情况下即使两个NULL被认为是相同的,但在标准SQL以及HQL中它们并不认为彼此相等;因此如果涉及到可能含有null的情况,则应考虑额外增加 IS NOT NULL 判断。 - 对于更复杂的应用场景比如多表联结查询或者其他高级特性,请参照官方文档或其他权威资料进一步学习了解[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值