Hibernate的检索方式

检索方式

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缓存,如果缓存中已存在该对象,则直接返回;若不存在,则查询数据库(返回所有属性)

适用场景:

  1. CUSTOMERS表中有大量字段
  2. 启用了二级缓存,并且缓存中可能已包含待查询的Customer对象


Query.setReadOnly()

默认情况下,如果对查询到的对象的属性做了修改,则当Hibernate清理缓存时,会去同步更新回数据库。

如果要只允许读取属性值,而不允许更新属性值,可用setReadOnly().










原文地址:https://www.cnblogs.com/javawebsoa/p/3001643.html