检索方式
1)导航对象图检索方式
customer.getOrders().iterator();
2)OID检索方式
session.get()、load();
3)HQL检索方式
// 创建Query对象 Query q = session.createQuery("from Customer as c where c.name=:name"); // 动态绑定参数 q.setString("name", "tom"); // 执行查询语句 q.list();
只需要提供面向对象的HQL查询语句,Hibernate就能根据映射文件的配置,将HQL转换为SQL,并将JDBC ResultSet结果集映射为关联的对象图。
4)QBC检索方式
Query By Criteria
// 创建Criteria对象 Criteria criteria = session.createCriteria(Customer.class); //设定查询条件 Criteria criteria1 = Restrictions.like("name", "T%"); Criteria criteria2 = Restrictions.eq("age", new Integer(21)); criteria = criteria.add(criteria1) .add(criteria2); // 执行查询语句 criteria.list();
QBC还提供了一种QBE子功能(Query by Example),能够把exampleCustomer对象中所有不为null的属性作为查询条件:
...... exampleCustomer.setAge(21); session.createCriteria(Customer.class) .add(Example.create(exampleCustomer)) .list();
类似于Query的setProperties:
session.createQuery(from customer where age=:age and name=:name) .setProperties(exampleCustomer) .list();
5)本地SQL检索方式
Query q = session.createSQLQuery("select * from CUSTOMERS where ...."); q.setString(...); q.list();
方法
使用别名
HQL:
session.createQuery("from Customer as c");
QBC:
不需要显式指定别名,Hibernate会自动把查询语句的根节点赋予别名“this”
session.createCriteria(Customer.class)
.add(Restrictions.eq("this.name", "tom"))
.list();
多态查询
HQL和QBC支持多态查询,能查询出当前类及其所有子类实例。
排序
HQL:
session.createQuery("from Customer as c order by c.name asc, c.age desc");
QBC:
session.createCriteria(Customer.class).addOrder(Order.asc("name"))
.addOrder(Order.desc("age"));
分页查询
query.setFirstResult(97);
query.setMaxResults(10);
query.list();
Criteria类似。
检索单个对象
session.createQuery(.....)
.setMaxResults(1)
.uniqueResult();
Criteria类似。
如果query包含多个对象,但没有调用setMaxResults(1),则会抛出NonUniqueResultException。
Query.iterate()
和list功能一样,但使用的查询机制不同:
list会返回对象的所有属性,而iterate则只返回ID属性
Iterator customers = query.iterate(); while(customers.hasNext()){ Customer cus = (Customer) customers.next(); //1 String name = cus.getName(); }
执行到customers.next()时,先查session缓存,如果缓存中已存在该对象,则直接返回;若不存在,则查询数据库(返回所有属性)
适用场景:
- CUSTOMERS表中有大量字段
- 启用了二级缓存,并且缓存中可能已包含待查询的Customer对象
Query.setReadOnly()
默认情况下,如果对查询到的对象的属性做了修改,则当Hibernate清理缓存时,会去同步更新回数据库。
如果要只允许读取属性值,而不允许更新属性值,可用setReadOnly().