使用JPA2在TypedQuery上设置超时

Gae*_*ano 0 java jpa java-ee criteria-api jpa-2.1

我想在javax.persistence.TypedQuery上设置超时.

我发现这个简单的方法:

TypedQuery<Foo> query = ... ;
query.setHint("javax.persistence.query.timeout", 1000);
query.getReturnList();
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用,它只是被忽略了.

PRO JPA 2书中:

"不幸的是,设置查询超时不是可移植行为.它可能不受所有数据库平台支持,也不是所有持久性提供程序都支持的要求.因此,必须为三种情况准备要启用查询超时的应用程序.

首先是该属性被默默地忽略并且没有效果.

第二个是启用该属性,并且中止任何超过指定超时值的选择,更新或删除操作,并抛出QueryTimeoutException.可以处理此异常,并且不会导致任何活动事务被标记为回滚.

第三种情况是该属性已启用,但在执行此操作时,数据库会在超出超时时强制执行事务回滚.在这种情况下,将抛出PersistenceException并将事务标记为回滚.通常,如果启用,则应编写应用程序以处理QueryTimeoutException,但如果超出超时并且不抛出异常,则不应该失败."

有没有人知道在TypedQuery上指定超时的任何其他方法?

或者我怎样才能使这个"提示"起作用?

谢谢

编辑:Oracle 11.2.0.4.0和PostgreSql 9.2.9与JPA 2.1/Hibernate

Ras*_*rma 5

我知道它的回复很晚,但是我们遇到类似的问题Oracle 11g,JPA2.0并且这个提示没有用.

实际上问题是我们使用它作为@NamedQuery提示并在@transactional方面调用函数.由于@NamedQuery在上下文加载时被加载和编译,因此事务超时会覆盖此超时.您可以在http://javadeveloperz0ne.blogspot.in/2015/07/why-jpa-hints-on-namedquery-wont-work.html找到更多信息.

解决方案是再次获取命名查询,然后应用超时.

Query query = entityManager.createNamedQuery("NamedQueryName");
query.setHint("org.hibernate.timeout", "5");
query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!