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

    技术2022-05-18  13

    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)