我正在尝试使用标准 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/