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

标签 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();

此查询应生成类似 select skip 20 first 10 的内容在 Informix 中。但是,它会生成以下内容:

select first 30 department0_.id as ... from DEPARTMENT department0_

我有<driver-class>com.informix.jdbc.IfxDriver</driver-class>standalone.xml JBoss 和 <property name="hibernate.dialect" value="org.hibernate.dialect.InformixDialect" />persistence.xml文件。如何使 Hibernate/JDBC 生成正确的查询?

最佳答案

“org.hibernate.dialect.InformixDialect”不支持限制。这是类(class)的片段:

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();
}

关于Hibernate/JDBC 为 Informix 数据库生成错误的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19219556/

相关文章:

java - 删除@ManyToMany关系中的引用方实体: JPA

Java:MS Access 和 JDBC 连接

java - Hibernate OneToMany 与 OrderBy 生成无效 SQL

java - JPA 连接运算符

jpa - EJB 3.0和JPA之间的关系?

java - 错误 : Before start of result set in Java

java - 缺少工件 springframework :spring-jdbc:jar:3. 1.1.RELEASE

java - "java.sql.SQLException The column .. in table .. does not allow null values"尽管列值不为空

java - 为 Eclipse 安装了 Hibernate Tools 插件,但无法访问代码生成功能

java - Service层异常处理