Java 使用HibernateTemplate和x27分页;s findByNamedParam函数
我已经看到了很多关于如何使用一些非常简单的查询创建分页的示例。但是我没有看到任何使用HibernateTemplate的findByNamedParam方法的情况 如何在使用findByNamedParam方法的同时设置查询的firstResult和maxResult参数Java 使用HibernateTemplate和x27分页;s findByNamedParam函数,java,hibernate,spring,Java,Hibernate,Spring,我已经看到了很多关于如何使用一些非常简单的查询创建分页的示例。但是我没有看到任何使用HibernateTemplate的findByNamedParam方法的情况 如何在使用findByNamedParam方法的同时设置查询的firstResult和maxResult参数 基本上,我正在尝试将分页添加到通过HibernateTemplate的findByNamedParam方法创建的hql查询中。好的,经过大量研究,我终于得到了我想要的 首先,需要创建HibernateCallback实现: H
基本上,我正在尝试将分页添加到通过HibernateTemplate的findByNamedParam方法创建的hql查询中。好的,经过大量研究,我终于得到了我想要的 首先,需要创建HibernateCallback实现: HibernateCallbackImpl.java:
import java.sql.SQLException;
import java.util.List;
import org.apache.poi.hssf.record.formula.functions.T;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
public class HibernateCallbackImpl
implements HibernateCallback<List<T>> {
private String queryString;
private String[] paramNames;
private Object[] values;
private int firstResult;
private int maxResults;
/**
* Fetches a {@link List} of entities from the database using pagination.
* Execute HQL query, binding a number of values to ":" named parameters in the query string.
*
* @param queryString a query expressed in Hibernate's query language
* @param paramNames the names of the parameters
* @param values the values of the parameters
* @param firstResult a row number, numbered from 0
* @param maxResults the maximum number of rows
*/
public HibernateCallbackImpl(
String queryString,
String[] paramNames,
Object[] values,
int firstResult,
int maxResults) {
this.queryString = queryString;
this.paramNames = paramNames;
this.values = values;
this.firstResult = firstResult;
this.maxResults = maxResults;
}
@Override
public List<T> doInHibernate(Session session) throws HibernateException,
SQLException {
Query query = session.createQuery(queryString);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
// TODO: throw proper exception when paramNames.length != values.length
for (int c=0; c<paramNames.length; c++) {
query.setParameter(paramNames[c], values[c]);
}
@SuppressWarnings("unchecked")
List<T> result = query.list();
return result;
}
}
import java.sql.SQLException;
导入java.util.List;
导入org.apache.poi.hssf.record.formula.functions.T;
导入org.hibernate.hibernateeexception;
导入org.hibernate.Query;
导入org.hibernate.Session;
导入org.springframework.orm.hibernate3.HibernateCallback;
公共类HibernateCallbackImpl
实现HibernateCallback{
私有字符串查询字符串;
私有字符串[]参数名;
私有对象[]值;
私人结果;
私有int-maxResults;
/**
*使用分页从数据库中获取{@link List}个实体。
*执行HQL查询,将多个值绑定到查询字符串中的“:”命名参数。
*
*@param queryString以Hibernate的查询语言表示的查询
*@param paramNames参数的名称
*@param values参数的值
*@param firstResult一个行号,从0开始编号
*@param maxResults最大行数
*/
公共HibernateCallbackImpl(
字符串查询字符串,
字符串[]参数名,
对象[]值,
int firstResult,
int(最大结果){
this.queryString=queryString;
this.paramNames=paramNames;
这个值=值;
this.firstResult=firstResult;
this.maxResults=maxResults;
}
@凌驾
public List doInHibernate(会话会话)抛出HibernateeException,
SQLException{
Query=session.createQuery(queryString);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
//TODO:当paramNames.length!=values.length时引发正确的异常
for(int c=0;c由@Corey提供的解决方案非常有效,但它在调用query.setParameter(…)的for循环中包含了一个问题
问题是它不考虑集合或数组的参数,这将导致weired ClassCastException,因为Hibernate试图通过调用集合或数组上的getId()来确定ID(这是错误的)。例如,如果使用in子句(例如….WHERE department in(:departments),就会发生这种情况…)其中“部门”是部门实体的数组或集合
这是因为集合或数组需要使用“query.setParameterList(paramName,(Object[])value”或“query.setParameterList(paramName,(Collection)value)”
长话短说:
我通过@Corey修改了该版本,添加了一个“applyNamedParameterToQuery()”方法,该方法是从org.springframework.orm.hibernate3.HibernateTemplate.applyNamedParameterToQuery(查询、字符串、对象)借用的:
import java.sql.SQLException;
导入java.util.List;
导入org.apache.poi.hssf.record.formula.functions.T;
导入org.hibernate.hibernateeexception;
导入org.hibernate.Query;
导入org.hibernate.Session;
导入org.springframework.orm.hibernate3.HibernateCallback;
公共类HibernateCallbackImpl
实现HibernateCallback{
私有字符串查询字符串;
私有字符串[]参数名;
私有对象[]值;
私人结果;
私有int-maxResults;
/**
*使用分页从数据库中获取{@link List}个实体。
*执行HQL查询,将多个值绑定到查询字符串中的“:”命名参数。
*
*@param queryString以Hibernate的查询语言表示的查询
*@param paramNames参数的名称
*@param values参数的值
*@param firstResult一个行号,从0开始编号
*@param maxResults最大行数
*/
公共HibernateCallbackImpl(
字符串查询字符串,
字符串[]参数名,
对象[]值,
int firstResult,
int(最大结果){
this.queryString=queryString;
this.paramNames=paramNames;
这个值=值;
this.firstResult=firstResult;
this.maxResults=maxResults;
}
@凌驾
public List doInHibernate(会话会话)抛出HibernateeException,
SQLException{
Query=session.createQuery(queryString);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
//TODO:当paramNames.length!=values.length时引发正确的异常
对于(int c=0;cyou应该接受您自己的答案,伙计。它就像一个符咒一样工作。@Christoph-我们不需要在return语句之前调用session.close()来释放关闭连接的命令吗?或者getHibernateTemplate.FindByNamedParam()吗处理好了吗?@Arvind是的,Springframework的Hibernate模板负责关闭会话/连接等。
@SuppressWarnings("unchecked")
List<TitleProductAccountApproval> tpaas =
getHibernateTemplate().executeFind(
new HibernateCallbackImpl(
hql.toString(),
paramNames.toArray(new String[paramNames.size()]),
values.toArray(),
firstResult,
maxResult
)
);
import java.sql.SQLException;
import java.util.List;
import org.apache.poi.hssf.record.formula.functions.T;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
public class HibernateCallbackImpl
implements HibernateCallback<List<T>> {
private String queryString;
private String[] paramNames;
private Object[] values;
private int firstResult;
private int maxResults;
/**
* Fetches a {@link List} of entities from the database using pagination.
* Execute HQL query, binding a number of values to ":" named parameters in the query string.
*
* @param queryString a query expressed in Hibernate's query language
* @param paramNames the names of the parameters
* @param values the values of the parameters
* @param firstResult a row number, numbered from 0
* @param maxResults the maximum number of rows
*/
public HibernateCallbackImpl(
String queryString,
String[] paramNames,
Object[] values,
int firstResult,
int maxResults) {
this.queryString = queryString;
this.paramNames = paramNames;
this.values = values;
this.firstResult = firstResult;
this.maxResults = maxResults;
}
@Override
public List<T> doInHibernate(Session session) throws HibernateException,
SQLException {
Query query = session.createQuery(queryString);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
// TODO: throw proper exception when paramNames.length != values.length
for (int c=0; c<paramNames.length; c++) {
applyNamedParameterToQuery(query, paramNames[c], values[c]);
}
@SuppressWarnings("unchecked")
List<T> result = query.list();
return result;
}
/**
* Code borrowed from org.springframework.orm.hibernate3.HibernateTemplate.applyNamedParameterToQuery(Query, String, Object)
*
* Apply the given name parameter to the given Query object.
* @param queryObject the Query object
* @param paramName the name of the parameter
* @param value the value of the parameter
* @throws HibernateException if thrown by the Query object
*/
protected void applyNamedParameterToQuery(Query queryObject, String paramName, Object value)
throws HibernateException {
if (value instanceof Collection) {
queryObject.setParameterList(paramName, (Collection) value);
}
else if (value instanceof Object[]) {
queryObject.setParameterList(paramName, (Object[]) value);
}
else {
queryObject.setParameter(paramName, value);
}
}
}