如何限制 JPA 和 Informix 中的查询?
Posted
技术标签:
【中文标题】如何限制 JPA 和 Informix 中的查询?【英文标题】:How to limit queries in JPA and Informix? 【发布时间】:2013-08-15 11:00:56 【问题描述】:当我位于结果列表的第一页时,生成的查询如下:
select first 10 books0_.id as id100_...
一切正常。但是,在第二页上,我收到以下错误:
org.hibernate.exception.GenericJDBCException: ResultSet Type is TYPE_FORWARD_ONLY.
列表代码在这里:
// calculating paging offset
int perPage = Integer.parseInt(Constants.RESULTS_PER_PAGE);
int firstResult = (page == null) ? 0 : (page - 1) * perPage;
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Books> criteria = builder.createQuery(Books.class);
Root<Books> entityRoot = criteria.from(Books.class);
criteria.select(entityRoot);
// constructing list of parameters
List<Predicate> predicates = new ArrayList<Predicate>();
...
// add the list of parameters
criteria.where(builder.and(predicates.toArray(new Predicate[])));
//execute query and paginate results
TypedQuery<Books> listQuery = em.createQuery(criteria);
listQuery.setFirstResult(firstResult);
listQuery.setMaxResults(perPage);
return listQuery.getResultList();
第二个查询生成的查询是:
select first 20 books0_.id as id100_...
什么时候应该是skip 10 first 10
。我现在如何使用 JPA 分页方法?
我正在使用JBoss 7.1
、Spring 3.2
、Hibernate 4.0.1
和 Informix 11.70
。
【问题讨论】:
页面初始值是多少?你在哪里初始化/设置这个值? 这是page=0
第一次。 RESULTS_PER_PAGE 是 10。页面的计算没有任何问题,当我使用带有 SKIP
和 FIRST
的本机查询时,它可以工作。
您可以查看以下示例以使用标准构建器实现相同的目的。 ***.com/questions/10144487/…
【参考方案1】:
不幸的是,Hibernate 团队已经有一段时间没有更新 Informix DBMS 的方言了,因此 Hibernate 发行版中的 InformixDialect 不支持 SKIP 功能。 Hibernate JIRA 在使用提供的补丁更新 InformixDialect HHH-5414 时遇到问题(已打开超过三年)。
您可以尝试将 InformixDialect 类替换为来自 IIUG site 的类。 只需将该文件放入您的项目中相应的包目录中并尝试一下。
【讨论】:
以上是关于如何限制 JPA 和 Informix 中的查询?的主要内容,如果未能解决你的问题,请参考以下文章