Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate/JDBC为Informix数据库生成错误的SQL_Hibernate_Jpa_Jdbc_Informix - Fatal编程技术网

Hibernate/JDBC为Informix数据库生成错误的SQL

Hibernate/JDBC为Informix数据库生成错误的SQL,hibernate,jpa,jdbc,informix,Hibernate,Jpa,Jdbc,Informix,我正在尝试使用标准JPA方法在Spring应用程序中实现分页。下面是一个非常简单的示例: TypedQuery<Department> depsQuery = em.createQuery("select d from Department d", Department.class); depsQuery.setFirstResult(20); depsQuery.setMaxResults(10); depsQuery.getResultList(); 我在JBoss的stand

我正在尝试使用标准JPA方法在Spring应用程序中实现分页。下面是一个非常简单的示例:

TypedQuery<Department> depsQuery = em.createQuery("select d from Department d", Department.class);
depsQuery.setFirstResult(20);
depsQuery.setMaxResults(10);
depsQuery.getResultList();
我在JBoss的
standalone.xml
中有
com.informix.jdbc.IfxDriver
,在
persistence.xml
文件中有
。如何使Hibernate/JDBC生成正确的查询?

org.Hibernate.dialogue.informixdialogue不支持限制。下面是该类的一个片段:

public boolean supportsLimitOffset() {
        return false;
    }

    public String getLimitString(String querySelect, int offset, int limit) {
        if ( offset > 0 ) {
            throw new UnsupportedOperationException( "query result offset is not supported" );
        }
        return new StringBuffer( querySelect.length() + 8 )
                .append( querySelect )
                .insert( querySelect.toLowerCase().indexOf( "select" ) + 6, " first " + limit )
                .toString();
    }
您可以扩展该类以创建自定义方言。然后重写上述两种方法

public boolean supportsLimitOffset() {
    return true;
}

public String getLimitString(String querySelect, int offset, int limit) {
    return new StringBuffer( querySelect.length() + 8 )
            .append( querySelect )
            .insert( querySelect.toLowerCase().indexOf( "select" ) + 6," skip " + offset + " first " + limit).toString();
}

我也遇到了同样的问题,上面的答案对我没有帮助。 仅覆盖getLimitString方法无效。 我还必须覆盖LimitHandler并打开一些布尔标志

import org.hibernate.dialect.pagination.AbstractLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.engine.spi.RowSelection;

public class TestDialect extends org.hibernate.dialect.InformixDialect {

    private static final LimitHandler LIMIT_HANDLER = new AbstractLimitHandler() {
        @Override
        public String processSql(String sql, RowSelection selection) {
            return getMyLimitString(sql, selection.getFirstRow(), selection.getMaxRows());
        }

        @Override
        public boolean supportsLimit() {
            return true;
        }

        @Override
        public boolean bindLimitParametersFirst() {
            return true; // must do, otherwise there will be an exception cause of preparedStatments
        }
    };

    //
    ////
    //

    public TestDialect() {
        super();
    }


    @Override
    public LimitHandler getLimitHandler() {
        return LIMIT_HANDLER;
    }

    @Override
    public String getLimitString(String querySelect, int offset, int limit) {       
        return getMyLimitString(querySelect, offset, limit);
    }

    public static String getMyLimitString(String querySelect, int offset, int limit) {
        /* SQL Syntax:
         * SELECT FIRST <limit> ...
         * SELECT SKIP <offset> FIRST <limit> ...
         */


        System.out.println("TestDialect.getMyLimitString()");

        if (offset < 0 || limit < 0) {
            throw new IllegalArgumentException("Cannot perform limit query with negative limit and/or offset value(s)");
        }

        StringBuffer limitQuery = new StringBuffer(querySelect.length() + 10);
        limitQuery.append(querySelect);
        int indexOfEndOfSelect = querySelect.toLowerCase().indexOf("select") + 6;

        if (offset == 0) {
            limitQuery.insert(indexOfEndOfSelect, " first ?"  );
        } else {
            limitQuery.insert(indexOfEndOfSelect, " skip ?" +   " first ?"  );
        }

        return limitQuery.toString();
    }

    @Override
    public boolean supportsLimit() {
        return true;
    }
}
import org.hibernate.dial.pagination.AbstractLimitHandler;
导入org.hibernate.dial.pagination.LimitHandler;
导入org.hibernate.engine.spi.RowSelection;
公共类TestDialogue扩展了org.hibernate.dialogue.InformixDialogue{
私有静态final LimitHandler LIMIT\u HANDLER=new AbstractLimitHandler(){
@凌驾
公共字符串processSql(字符串sql,行选择){
返回getMyLimitString(sql,selection.getFirstRow(),selection.getMaxRows());
}
@凌驾
公共布尔支持slimit(){
返回true;
}
@凌驾
公共布尔bindLimitParametersFirst(){
return true;//必须执行,否则将导致PreparedStations异常
}
};
//
////
//
公共测试方言(){
超级();
}
@凌驾
public LimitHandler getLimitHandler(){
返回限制处理程序;
}
@凌驾
公共字符串getLimitString(字符串querySelect,int offset,int limit){
返回getMyLimitString(查询选择、偏移、限制);
}
公共静态字符串getMyLimitString(字符串查询选择、整数偏移量、整数限制){
/*SQL语法:
*先选择。。。
*选择先跳过。。。
*/
System.out.println(“testdial.getMyLimitString()”;
如果(偏移量<0 | |极限<0){
抛出新的IllegalArgumentException(“无法使用负限制和/或偏移值执行限制查询”);
}
StringBuffer limitQuery=新的StringBuffer(querySelect.length()+10);
limitQuery.append(querySelect);
int indexOfEndOfSelect=querySelect.toLowerCase().indexOf(“select”)+6;
如果(偏移量==0){
limitQuery.insert(indexOfEndOfSelect,“first?”);
}否则{
insert(indexOfEndOfSelect,“skip?”+“first?”);
}
返回limitQuery.toString();
}
@凌驾
公共布尔支持slimit(){
返回true;
}
}
我最终使用了,但这就是解决方案,谢谢。
import org.hibernate.dialect.pagination.AbstractLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.engine.spi.RowSelection;

public class TestDialect extends org.hibernate.dialect.InformixDialect {

    private static final LimitHandler LIMIT_HANDLER = new AbstractLimitHandler() {
        @Override
        public String processSql(String sql, RowSelection selection) {
            return getMyLimitString(sql, selection.getFirstRow(), selection.getMaxRows());
        }

        @Override
        public boolean supportsLimit() {
            return true;
        }

        @Override
        public boolean bindLimitParametersFirst() {
            return true; // must do, otherwise there will be an exception cause of preparedStatments
        }
    };

    //
    ////
    //

    public TestDialect() {
        super();
    }


    @Override
    public LimitHandler getLimitHandler() {
        return LIMIT_HANDLER;
    }

    @Override
    public String getLimitString(String querySelect, int offset, int limit) {       
        return getMyLimitString(querySelect, offset, limit);
    }

    public static String getMyLimitString(String querySelect, int offset, int limit) {
        /* SQL Syntax:
         * SELECT FIRST <limit> ...
         * SELECT SKIP <offset> FIRST <limit> ...
         */


        System.out.println("TestDialect.getMyLimitString()");

        if (offset < 0 || limit < 0) {
            throw new IllegalArgumentException("Cannot perform limit query with negative limit and/or offset value(s)");
        }

        StringBuffer limitQuery = new StringBuffer(querySelect.length() + 10);
        limitQuery.append(querySelect);
        int indexOfEndOfSelect = querySelect.toLowerCase().indexOf("select") + 6;

        if (offset == 0) {
            limitQuery.insert(indexOfEndOfSelect, " first ?"  );
        } else {
            limitQuery.insert(indexOfEndOfSelect, " skip ?" +   " first ?"  );
        }

        return limitQuery.toString();
    }

    @Override
    public boolean supportsLimit() {
        return true;
    }
}