【发布时间】:2015-12-06 08:15:09
【问题描述】:
Query query = entityManager.createQuery("select distinct(id) From Table where plant=?1").setParameter(1, plant);
query.setFirstResult((pageNo-1) * pageSize);
query.setMaxResults(pageSize);
List<String> Ids = query.getResultList();
这段代码在 SQL Server 2008 上运行良好,但是当我将数据库从 2008 年迁移到 2014 年时,这给了我以下错误:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The requested operation is not supported on forward only result sets.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.throwNotScrollable(SQLServerResultSet.java:376)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.verifyResultSetIsScrollable(SQLServerResultSet.java:399)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.absolute(SQLServerResultSet.java:1474)
at org.jboss.jca.adapters.jdbc.WrappedResultSet.absolute(WrappedResultSet.java:131)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.hibernate.engine.jdbc.internal.proxy.AbstractResultSetProxyHandler.continueInvocation(AbstractResultSetProxyHandler.java:104)
... 170 more
我尝试过以下操作:
1. jdbc驱动由sqljdbc4.0.jar改为sqljdbc4.2.jar。
-
sql server 不支持
LIMIT
String query = "select distinct ID from Table limit" + 偏移量 + ", " + noOfRecords;
-
ROW_NUMBER()不是一个好的解决方案,因为我想要不同的记录
【问题讨论】:
-
问题在于 Hibernate 调用只在可滚动结果集上可用和支持(按规范!)的只进结果集的方法。您需要向 Hibernate 提交一个错误,如果他们要调用这些方法,他们应该明确要求可滚动的结果集。请注意,SQL Server 可能不知道
LIMIT,但它确实知道TOP,请参阅msdn.microsoft.com/en-us/library/ms176104.aspx -
@rohit-k 你最后解决了这个问题吗?怎么样?
-
@Krzysiek 无法解决...我已要求客户端开发人员在那里处理分页 :-)
标签: java sql-server hibernate jpa jdbc