hibernate之查询(设置查询提示) (转)

转自:http://blog.csdn.net/fhd001/article/details/6272438

 

hibernate之查询(设置查询提示)

----------
1.setFlushMode()

假设你在执行查询之前修改了持久化对象。这些修改只出现在内存中,因此hibernate在执行查询之前,把持久化上下文和所有的变化清除到数据库。这样保证了查询在当前的数据中运行,并保证在查询结果和内存之间不会出现冲突。

这有时候是不现实的,例如,如果你执行一系列包含许多个查询-修改-查询-修改的操作,并且每次查询都获取一个与以前不同的数据集。换句话说,不需要在执行查询之前把修改清除到数据库。

可以在session中,利用setFlushMode()禁用持久化上下文的清除。如例:

session.setFlushMode(FlushMode.COMMIT); 

 

或者,如果你想要只在特定的查询之前禁用清除,可以在Query对象中设置一个FlushMode,如例:

Query q = session.createQuery(queryString).setFlushMode(FlushMode.COMMIT);  

 

hibernate不会在执行这个查询之前清除持久化上下文。

2.setCacheMode()

这是对查询结果的一个细粒度的优化,控制hibernate如何与二级缓存交互。

如例:

session.setCacheMode(CacheMode.IGNORE); 
      或 
      Query q = session.createQuery("from Item").setCacheMode(CacheMode.IGNORE); 
      或 
      Criteria criteria = session.createCriteria(Item.class).setCacheMode(CacheMode.IGNORE);  

 

上例,CacheMode.IGNORE告诉hibernate不要为这个查询返回的任何实体而与二级缓存交互。换句话说,通过这个查询获取到的任何Item都不放在二级缓存中,如果你执行一个不应该更新二级高速缓存的查询,设置这种高速缓存模式就很有用,或许因为你正在获取的数据只与特定的情况相关,因此不应该耗尽高速缓存区域中的可用空间。


3.setReadOnly()

给特定的持久化对象禁用脏查询的一种方法 是设置session.setReadOnly(object,true)。你可以告诉Hibernate:由查询返回的所有实体对象都应该被当作是只读的。如例:

Query q = session.createQuery("from Item").setReadOnly(true); 

 

由这个查询返回的所有Item对象都处于持久化状态,但是在持久化上下文中,没有给自动脏检查启用任何快照。hibernate不会自动持久化任何修改,除非用session.setReadOnly(object,false)禁用只模式。

4.setTimeout()

设置超时(timeout),来控制允许一个查询运行多久,如例:

Query q = session.createQuery("from Item").setTimeout(60); //1 minute 
      Criteria criteria = session.createCriteria(Item.class).setTimeout(60);  

 

这种方法与JDBC Statement中的setQueryTimeout()方法有着相同的语义和结果。

5.setFetchSize()
设置抓取大小,如例:

Query q = session.createQuery("from Item").setFetchSize(50); 
      Criteria criteria = session.createCriteria(Item.class).setFetchSize(50); 

 

JDBC抓取大小是对数据库驱动程序的一个优化提示:如果驱动程序没有实现这个功能,它就不能导致任何性能改善。如果它实现了,当客户端在一个查询结果(即ResultSet)中操作时,通过在一个批量中获取许多个行,可以改善JDBC客户端和数据库之间的通信。由于Hibernate幕后正在使用ResultSet,如果用list()执行一个查询,这个提示就可以改善数据获取。

6.setLockMode()
可以控制查询是否应该在数据库管理系统中强制悲观锁---这是一直持续到数据库事务结束的锁。如例:

Query q = session.createQuery("from Item item").setLockMode("item",LockMode.UPGRADE); 
      Criteria criteria = session.createCriteria(Item.class).setLockMode(LockMode.UPGRADE);  

这两个查询,如果得到数据库方言的支持,都会生成一个包括...FOR UPDATE操作的SQL声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值