Hibernate 5:使用命名查询,无状态会话返回java.lang.UnsupportedOperationException
在我们将项目从Hibernate4升级到5之后,我们遇到了这样一个异常,我们试图从带有无状态会话的命名查询中获得可滚动的结果。到目前为止,我们已经尝试用谷歌搜索它并设置参数,但似乎在NamedQuery对象中默认启用了缓存,而无状态会话类在尝试在其中设置chacheMode时抛出java.lang.UnsupportedOperationException(hibernate自己的实现)。代码如下:Hibernate 5:使用命名查询,无状态会话返回java.lang.UnsupportedOperationException,hibernate,named-query,hibernate-5.x,Hibernate,Named Query,Hibernate 5.x,在我们将项目从Hibernate4升级到5之后,我们遇到了这样一个异常,我们试图从带有无状态会话的命名查询中获得可滚动的结果。到目前为止,我们已经尝试用谷歌搜索它并设置参数,但似乎在NamedQuery对象中默认启用了缓存,而无状态会话类在尝试在其中设置chacheMode时抛出java.lang.UnsupportedOperationException(hibernate自己的实现)。代码如下: public <T> Results<T> fetchScrollabl
public <T> Results<T> fetchScrollableResultsByQueryName(String queryName, List<String> paramNames, List<Object> paramValues){
StatelessSession slsession = getStatelessSession();
ScrollableResults scrollableResults = createQueryByName(queryName, slsession, paramNames, paramValues).scroll(ScrollMode.FORWARD_ONLY);
return(new ResultsHibernateStateless<T>(scrollableResults, slsession));
}
protected Query createQuery(String queryStr, StatelessSession slsession, List<String> paramNames, List<Object> paramValues ) {
Query query = (Query) slsession.createQuery(queryStr);
setQueryTimeout(query);
query.setFetchSize(fetchSize);
query.setReadOnly(true);
query.setCacheMode(null);
query.setCacheable(false);
this.addNamedParamToQuery(query, paramNames, paramValues);
return query;
}
如果有人知道这是hibernate 5中的一个已知错误,或者有解决此问题的方法???我认为您的问题的根本原因如下:
query.setCacheMode(null);
您应该将其删除,因为如果查看,您将看到:
@Override
public void setCacheMode(CacheMode cm) {
throw new UnsupportedOperationException();
}
另请参见中的其他信息:
无状态会话
未提供的一些功能包括:
- 一级缓存
- 与任何二级缓存或查询缓存的交互
- 事务性写延迟或自动脏检查
我认为这方面问题的根本原因是:
query.setCacheMode(null);
您应该将其删除,因为如果查看,您将看到:
@Override
public void setCacheMode(CacheMode cm) {
throw new UnsupportedOperationException();
}
另请参见中的其他信息:
无状态会话
未提供的一些功能包括:
- 一级缓存
- 与任何二级缓存或查询缓存的交互
- 事务性写延迟或自动脏检查
尝试在通话前设置提示。滚动(仅限滚动模式。向前)如下所示: setHint(JPA_共享_缓存_存储_模式,null);
setHint(JPA_共享_缓存_检索_模式,null) 尝试在通话前设置提示。按如下方式滚动(仅限ScrollMode.FORWARD_): setHint(JPA_共享_缓存_存储_模式,null);
setHint(JPA_共享_缓存_检索_模式,null) 我们也在hibernate社区上发现了这个问题,但不确定他们是否承认这个问题或提供了任何解决方案,我们也在hibernate社区上发现了这个问题,但不确定他们是否承认这个问题或提供了任何解决方案,我尝试了这两种方法,设置了不同的值并删除了这一行,问题iscacheMode在此点之前已预初始化。因此,删除此行后您会看到什么异常。相同的异常。请提供此代码段中提到的所有方法的完整实现,如:
getStatelessSession
,setQueryTimeout
,addNamedParamToQuery
。或者发布允许在github上重现此问题的最小项目。我已附上此报告的hibernate问题[链接]。您可以尝试运行本期中提到的测试用例,并将看到异常。我尝试了这两种方法,设置了不同的值并删除了这一行,问题是iscacheMode在这一点之前就已经预初始化了,删除这一行后,您会看到什么异常。相同的异常。请提供此代码段中提到的所有方法的完整实现,如:getStatelessSession
,setQueryTimeout
,addnamedparametoquery
。或者发布允许在github上重现此问题的最小项目。我已附上此报告的hibernate问题[链接]。您可以尝试运行本期中提到的测试用例,并将看到异常。