老版本:(1)createQuery的参数在设置的时候i=0,所以position默认从1开始
类:public class QueryImpl<X> extends AbstractQueryImpl<X>
implements TypedQuery<X>, HibernateQuery, org.hibernate.ejb.HibernateQuery
方法: private void extractParameterInfo(Map<String, Class> namedParameterTypeRedefinition)
142行:registerParameter( new ParameterRegistrationImpl( this, query, i + 1, javaType ) );}
(2)setParamer的时候要从1开始,会比较position的位置
类:public abstract class BaseQueryImpl implements Query
方法:protected <X> ParameterRegistration<X> findParameterRegistration(int parameterPosition)
497行:if ( parameterPosition == param.getPosition() ) {
return (ParameterRegistration<X>) param;
}
java.lang.IllegalArgumentException: Parameter with that position [0] did not exist
at org.hibernate.jpa.spi.BaseQueryImpl.findParameterRegistration(BaseQueryImpl.java:502)
at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.java:692)
at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:181)
at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:32)
新版本 不能从1开始
AbstractSharedSessionContract.createQuery final QueryImpl query = new QueryImpl(this,getQueryPlan( queryString, false ).getParameterMetadata(),queryString);
getParameterMetadata 会返回parameterMetadata.getOrdinalParametersZeroBasedCopy();//获取基于0开始的参数拷贝
设置为1这里会抛出异常,因为不是基于0开始了
ParameterMetadata的实现类为ParameterMetadataImpl
java.lang.IllegalArgumentException: Unknown parameter position: 1
at org.hibernate.query.internal.QueryParameterBindingsImpl.getBinding(QueryParameterBindingsImpl.java:240)
at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:503)
at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:104)
at cn.anycall.base.dao.impl.BaseDAOImpl.query(BaseDAOImpl.java:84)