Hibernate查询小结

来源:互联网 发布:阿里云发票抬头修改 编辑:程序博客网 时间:2024/06/05 17:35

从数据库中获取对象是Hibernate最有趣的部分之一。Hibernate获取对象的方式有如下几种:

  1. 根据id获取, 在已知对象id的情况下,这是最方便的.
  2. 使用Hibernate Query Language (HQL), 面向对象的查询。 Java Persistence query language (JPA QL) 是 Hibernate query language 标准化后的子集.
  3. 使用Hibernate Criteria, 一种类型安全且面向对象的查询。 包括QBE(Query By Example)查询(后面会有一个例子).
  4. Native SQL queries, 包含存储过程调用, Hibernate仍然负责将查询结果集封装到对象图上.

Retrieval by identifier:

根据id获取对象将产生一条或多条sql语句(如果出现对象继承或多表查询),id通常是表中的主键。

例如,我们要查询id为100的User对象:

User user = (User) session.load(User.class, new Long(100));//另一种方式User user = (User) session.get(User.class, new Long(100));

 session.load 和 session.get 有什么区别呢? 根据Hibernate官方文档, 使用load()时,如果在缓存或数据库中找不到指定的对象, 方法将抛出异常并且 load() 不会返回null。get() 方法在找不到对象时将返回null。

load() 返回的是一个代理而不是一个真正的持久化实例。在需要用到实例时,代理才会去加载真正的对象;而get() 返回的不是一个代理。 从 get() 和 load()做出取舍很简单: 如果你确定对象存在, load() 是一个好选择; 如果你不确定具有给定id的对象是否存在, 使用 get() 并且别忘了判断其返回值是否为null。

使用load() 还有进一步的含义: 应用取得了持久化实例的一个有效的引用 (一个代理) 但没有必要从数据库中获取实例的状态。所以load() 方法在没有从缓存或数据库中找到对象时未必会立即抛出异常; 而是在你用到这个代理时,异常才会被抛出。 当然, 根据id获取对象没有下面的几种方式便利。

The Hibernate Query Language (HQL)

多数时候,你仅需要根据限定对象属性来获取对象。例如,下面的查询根据surname获取一个Customer:

Query q = session.createQuery("from Customer as c where c.surname = :surname");q.setString("surname", "Frank");List result = q.list();

先创建一个Query对象q, 然后将一个值绑定到命名参数 :fname 上。 调用list方法返回一个Customer的集合.

Hibernate Criteria interface

Hibernate query by criteria (QBC) API 允许你在运行时操作criteria对象。不用直接操纵一个长的查询字符串,你可以动态的绑定结束(查询条件):

Criteria criteria = session.createCriteria(Customer.class);criteria.add( Restrictions.like("surname", "Frank") );List result = criteria.list();

Native Queries:

如果你需要用到native queries (特定于某一数据库平台的查询,更利于优化但不建议使用) ,可以像下面这样使用 createNativeQuery 方法:

Query sqlQuery =session.                             createNativeQuery("select c.customer_ID, c.customer_NAME, c.customer_SURNAME from Customer c",Customer.class);

下面给出一个Query By Example (QBE)的示例:

public List<Person> find(Person person) {Session session = getSession();Example example = Example.create(person) .enableLike(MatchMode.ANYWHERE) .excludeZeroes() .ignoreCase();List<Person> result = session.createCriteria(Person.class) .add(example) .list(); return result;}


本文由尤慕译自这里,转载请保留此条信息。



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 内分泌失调引起的肥胖怎么办 宝宝接种证丢了怎么办 不给补办接种证怎么办 儿童接种证丢了怎么办 疫苗接种本丢了怎么办 脊灰滴剂滴多了怎么办 鞋小了挤脚趾头怎么办 大母脚趾头疼是怎么办 小脚趾内侧长茧怎么办 小脚趾肿了很痛怎么办 穿袜子大脚趾痛怎么办 脚指头长水泡很痒怎么办 走路脚打起泡了怎么办 剪完脚趾甲肿了怎么办 大脚趾关节处疼怎么办 战士10穿不进去怎么办 脚上皮肤干燥起皮怎么办 脚趾头冻了很痒怎么办 大脚趾里面有脓怎么办 大脚趾肉肿了怎么办 大脚趾边上肿了怎么办 大母脚趾关节疼怎么办 大脚趾有点歪了怎么办 大脚趾扭伤肿了怎么办 大脚趾外翻怎么办 知乎 颈椎带着胳膊疼怎么办 胳膊酸困无力是怎么办 腰疼引起的腿麻怎么办 手臂到手指麻痛怎么办 拔完智齿特别疼怎么办 躺着胃烧的难受怎么办 喝酒胃烧的难受怎么办 舌头破了特别疼怎么办 舌头又厚又大怎么办 牙齿咬到舌头了怎么办 舌头起了好多泡怎么办 舌头尖起泡很痛怎么办 舌头上起泡怎么办很疼 月经来了二十多天还不干净怎么办 三岁宝宝缺锌怎么办 无舌苔,舌头很红怎么办