Hibernate informix数据库的分页

Hibernate informix数据库的分页,hibernate,pagination,offset,informix,Hibernate,Pagination,Offset,Informix,我试图为IBMInformixDB进行分页,但Hibernate方言有一些限制,因为它不会生成限制查询。 当我查看IBM Informix手册时,它告诉我以下答案:- "The Projection clause cannot include the SKIP, FIRST, or LIMIT keywords in these contexts: when the SELECT statement is part of a view definition in a subquery, exc

我试图为IBMInformixDB进行分页,但Hibernate方言有一些限制,因为它不会生成限制查询。 当我查看IBM Informix手册时,它告诉我以下答案:-

"The Projection clause cannot include the SKIP, FIRST, or LIMIT keywords in these contexts:

when the SELECT statement is part of a view definition
in a subquery, except in the FROM clause of the outer query
in a cross-server distributed query in which a participating database server does not support the SKIP, FIRST, or LIMIT keywords."
我试图为LIMIT类编写自己的实现,并在加载Hibernate方言时加载它。但每次启动应用程序时,它都会选择默认方言,而不是我的

hibernate中存在一个问题-

这个补丁在我的本地服务器上不起作用。 但我担心,由于DB本身不支持,那么如果我尝试手动执行此操作,效率会有多高,因为这将是一种基于偏移量的分页,我觉得这会影响性能,可能无法解决问题


我想知道,考虑到informix分页支持的这些场景,可以做什么最好

是的,现在在Hibernate中解决了这个问题(至少在5.3.10.Final-redhat-00001中解决了这个问题,目前我们主要使用的是jboss EAP7服务器),您只需添加

<property name="hibernate.dialect" value="org.hibernate.dialect.Informix10Dialect" />
其中query是javax.persistence.query

触发此类查询的合理预期是表单上的SQL“本机”输出

select skip <firstResult> limit <pageSize> [rest of the select statement]
黑客

hibernate-core-4.x.x.Final-pagination 
只是换了班而已

org.hibernate.dialect.InformixDialect
org.hibernate.dialect.pagination.NoopLimitHandler
org.hibernate.dialect.pagination.FirstLimitHandler
因此,这些首先由

@Override
public boolean supportsLimitOffset() {
    return true;
}
然后我们用一些简单的方法实现了这些东西,比如

public final class InformixDialect extends Dialect {
..
private static final String SKIP = " SKIP ";
private static final String FIRST = " FIRST ";
private static final String SELECT = "select";
private static final int SELECT_LEN = SELECT.length();
..  
@Override        
public String getLimitString(String querySelect, int offset, int limit) {
    return new StringBuilder(querySelect.length() + 8)
            .append(querySelect)
            .insert(querySelect.toLowerCase().indexOf(SELECT) + SELECT_LEN, new StringBuilder(SKIP).append(offset).append(FIRST).append(limit).toString()).toString();
}
..
和(NoopLimitHandler完全相同)


也就是说,如果您可以使用Hibernate 5,这当然是更好的选择

是的,现在在Hibernate中解决了这个问题(至少在5.3.10.Final-redhat-00001中解决了这个问题,目前我们主要使用的是jboss EAP7服务器),您只需添加

<property name="hibernate.dialect" value="org.hibernate.dialect.Informix10Dialect" />
其中query是javax.persistence.query

触发此类查询的合理预期是表单上的SQL“本机”输出

select skip <firstResult> limit <pageSize> [rest of the select statement]
黑客

hibernate-core-4.x.x.Final-pagination 
只是换了班而已

org.hibernate.dialect.InformixDialect
org.hibernate.dialect.pagination.NoopLimitHandler
org.hibernate.dialect.pagination.FirstLimitHandler
因此,这些首先由

@Override
public boolean supportsLimitOffset() {
    return true;
}
然后我们用一些简单的方法实现了这些东西,比如

public final class InformixDialect extends Dialect {
..
private static final String SKIP = " SKIP ";
private static final String FIRST = " FIRST ";
private static final String SELECT = "select";
private static final int SELECT_LEN = SELECT.length();
..  
@Override        
public String getLimitString(String querySelect, int offset, int limit) {
    return new StringBuilder(querySelect.length() + 8)
            .append(querySelect)
            .insert(querySelect.toLowerCase().indexOf(SELECT) + SELECT_LEN, new StringBuilder(SKIP).append(offset).append(FIRST).append(limit).toString()).toString();
}
..
和(NoopLimitHandler完全相同)


也就是说,如果您可以使用Hibernate 5,这当然是更好的选择

我最近看到了这个帖子:-。它谈到“使用提供Informix10LimitHandler的Informix10方言”。它谈到“使用提供Informix10LimitHandler的Informix10方言。”