如何限制 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.1Spring 3.2Hibernate 4.0.1Informix 11.70

【问题讨论】:

页面初始值是多少?你在哪里初始化/设置这个值? 这是page=0 第一次。 RESULTS_PER_PAGE 是 10。页面的计算没有任何问题,当我使用带有 SKIPFIRST 的本机查询时,它可以工作。 您可以查看以下示例以使用标准构建器实现相同的目的。 ***.com/questions/10144487/… 【参考方案1】:

不幸的是,Hibernate 团队已经有一段时间没有更新 Informix DBMS 的方言了,因此 Hibernate 发行版中的 InformixDialect 不支持 SKIP 功能。 Hibernate JIRA 在使用提供的补丁更新 InformixDialect HHH-5414 时遇到问题(已打开超过三年)。

您可以尝试将 InformixDialect 类替换为来自 IIUG site 的类。 只需将该文件放入您的项目中相应的包目录中并尝试一下。

【讨论】:

以上是关于如何限制 JPA 和 Informix 中的查询?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot informix Jpa 连接

Spring Data JPA 中的分页(限制和偏移)

如何使用连接执行 Informix ISQL 查询

JPA 一个实体中的两个惰性集合 - 如何运行 JPA 查询以获取实体和只有一个集合

sql查询标题信息以及informix中的列中的数据

如何在 Informix 上测量查询性能?