您的位置:首页 > 其它

Hibernate的检索方式

2013-04-05 22:00 169 查看

检索方式

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().
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: