-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: QueryException: Expected positional parameter count:...
PostPosted: Thu Jul 28, 2005 4:18 am 
Newbie

Joined: Thu Jul 28, 2005 3:28 am
Posts: 2
Hello

Error on executing the following HQL:
SELECT i FROM ch.slf.sdbobj.ams.Imis150 as i WHERE i.id.standort in (?) AND i.id.datum = ( SELECT MAX(i1.id.datum) FROM ch.slf.sdbobj.ams.Imis150 as i1 WHERE i1.id.standort = i.id.standort)
Exception thrown:
org.hibernate.QueryException: Expected positional parameter count: 1, actual parameters: [ch.slf.sdbobj.station.Standort@2ed755] [SELECT i FROM ch.slf.sdbobj.ams.Imis150 as i WHERE i.id.standort in (?) AND i.id.datum = ( SELECT MAX(i1.id.datum) FROM ch.slf.sdbobj.ams.Imis150 as i1 WHERE i1.id.standort = i.id.standort)]


Guessed reason:
The parameter (ch.slf.sdbobj.station.Standort@2ed755) used in HQL is a hibernate object containing a combined primary key (see mapping below).
The method AbstractQueryImpl.verifyParameters(...) compares the number of '?' in the HQL with the number of key-columns of the parameters.
This does not match!

Debugging the hibernate code, I figured:
1) org.hibernate.impl.AbstractQueryImpl.initParameterBookKeeping(...)
- Counts the '?' in the HQL and stores them in the member org.hibernate.impl.AbstractQueryImpl.positionalParameterCount
2) org.hibernate.impl.AbstractQueryImpl.verifyParameters(....)
- Iterates over the positional parameters, and counts the key columns, used to reference them and holds them in the local variable positionalValueSpan.
- compares positionalParameterCount with positionalValueSpan.
Conclusion:
Because one time, the objects are counted, and the other time, the columns, this only works when no combined key columns are used.
Correct me if I'm wrong.
Is this an issue, or am I doing something wrong?

Exception including stack trace:
org.hibernate.QueryException: Expected positional parameter count: 1, actual parameters: [ch.slf.sdbobj.station.Standort@2ed755] [SELECT i FROM ch.slf.sdbobj.ams.Imis150 as i WHERE i.id.standort in (?) AND i.id.datum = ( SELECT MAX(i1.id.datum) FROM ch.slf.sdbobj.ams.Imis150 as i1 WHERE i1.id.standort = i.id.standort)]
at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:141)
at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:102)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:70)
at org.springframework.orm.hibernate3.HibernateTemplate$33.doInHibernate(HibernateTemplate.java:528)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:176)
at org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:196)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:522)
at ch.slf.ifkis.hydro.server.dao.hibernate.AmsDataAccess.getLatestImis150DataList(AmsDataAccess.java:98)
at ch.slf.ifkis.hydro.server.service.AmsServiceImpl.getLatestImis150DataMap(AmsServiceImpl.java:89)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at ch.slf.ifkis.base.server.service.AbstractService.invokeMethode(AbstractService.java:267)
at ch.slf.ifkis.base.server.service.MethodInvoker.invoke(MethodInvoker.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:287)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
at $Proxy0.invoke(Unknown Source)
at ch.slf.ifkis.base.server.service.AbstractService.invoke(AbstractService.java:225)
at $Proxy6.getLatestImis150DataMap(Unknown Source)
at ch.slf.ifkis.hydro.web.view.Imis150ViewController.getLatestDataMap(Imis150ViewController.java:47)
at ch.slf.ifkis.hydro.web.view.AmsViewController.handleDataAktuell(AmsViewController.java:133)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.web.servlet.mvc.multiaction.MultiActionController.invokeNamedMethod(MultiActionController.java:351)
at org.springframework.web.servlet.mvc.multiaction.MultiActionController.handleRequestInternal(MultiActionController.java:305)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:128)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:684)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:625)
at org.springframework.web.servlet.FrameworkServlet.serviceWrapper(FrameworkServlet.java:386)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:346)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)


Mappings:
<class name="ch.slf.sdbobj.ams.Imis150" table="IMIS150">
<meta attribute="implement-equals">true</meta>
<composite-id name="id" class="ch.slf.sdbobj.ams.type.Imis150id" >
<meta attribute="use-in-equals">true</meta>
<key-property name="datum" column="DATUM" type="date">
<meta attribute="use-in-equals">true</meta>
</key-property>
<key-many-to-one name="standort" class="ch.slf.sdbobj.station.Standort" >
<meta attribute="use-in-equals">true</meta>
<column name="STAT_ABK" />
<column name="STAO_NR" />
</key-many-to-one>
</composite-id>
:
:
</class>


<class name="ch.slf.sdbobj.station.Standort" table="standort" batch-size="64" mutable="false">
<meta attribute="implement-equals">true</meta>

<composite-id name="id" class="ch.slf.sdbobj.station.type.StandortId">
<meta attribute="use-in-equals">true</meta>
<key-property name="statAbk" column="stat_abk" type="string"><meta attribute="use-in-equals">true</meta></key-property>
<key-property name="nr" column="stao_nr" type="java.lang.Integer"><meta attribute="use-in-equals">true</meta></key-property>
</composite-id>
:
:
</class>


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jul 28, 2005 6:58 am 
Newbie

Joined: Thu Jul 28, 2005 3:28 am
Posts: 2
Hello again

Sorry, I forgot to post the Hibernate version I'm using:
Hibernate 3.0,5

After patching the method AbstractQueryImpl.verifyParameters(...) so that it runs through, Hybernate produces some wired SQL-Statements, that can not be executed by oracle.
So my guess is:
Using hibernate objects with combined primary keys in the where clause of HQL is not supported at the moment.
Is this the case?

Regards Matthias Gerber

HQL Example and resulting SQL:
HQL:
SELECT i FROM ch.slf.sdbobj.ams.Imis150 as i WHERE i.id.standort in (?) AND i.id.datum = ( SELECT MAX(i1.id.datum) FROM ch.slf.sdbobj.ams.Imis150 as i1 WHERE i1.id.standort = i.id.standort)
SQL:
select . . . where ((imis150x0_.STAT_ABK, imis150x0_.STAO_NR)in (?)) and imis150x0_.DATUM=(select MAX(imis150x1_.DATUM) from IMIS150 imis150x1_ where (imis150x1_.STAT_ABK, imis150x1_.STAO_NR)=(imis150x0_.STAT_ABK, imis150x0_.STAO_NR))
results in java.sql.SQLException: ORA-01036: Illegal Parameter Name/Value.

HQL:
SELECT i FROM ch.slf.sdbobj.ams.Imis150 as i WHERE i.id.standort = ? AND i.id.datum = ( SELECT MAX(i1.id.datum) FROM ch.slf.sdbobj.ams.Imis150 as i1 WHERE i1.id.standort = i.id.standort)
SQL:
select . . . from IMIS150 imis150x0_
where (imis150x0_.STAT_ABK, imis150x0_.STAO_NR)=? and imis150x0_.DATUM=
(select MAX(imis150x1_.DATUM) from IMIS150 imis150x1_
where (imis150x1_.STAT_ABK, imis150x1_.STAO_NR)=(imis150x0_.STAT_ABK, imis150x0_.STAO_NR))
results in java.sql.SQLException: ORA-01036: Illegal Parameter Name/Value.
SQL, As it would work:
select . . . from IMIS150 imis150x0_
where (imis150x0_.STAT_ABK, imis150x0_.STAO_NR) = (SELECT ?, ? FROM DUAL) and imis150x0_.DATUM=
(select MAX(imis150x1_.DATUM) from IMIS150 imis150x1_
where imis150x1_.STAT_ABK = imis150x0_.STAT_ABK AND imis150x1_.STAO_NR = imis150x0_.STAO_NR
)


Patched method AbstractQueryImpl.verifyParameters(...):
Code:
protected void verifyParameters(boolean reserveFirstParameter) throws HibernateException {

  if ( actualNamedParameters.size() != namedParameters.size() + namedParameterLists.size() ) {
         Set missingParams = new HashSet(actualNamedParameters);
         missingParams.removeAll( namedParameterLists.keySet() );
         missingParams.removeAll( namedParameters.keySet() );
         throw new QueryException( "Not all named parameters have been set: " + missingParams, getQueryString() );
      }
      
      int positionalValueSpan = 0;
      int positionalValueCount = 0;               // added
      for ( int i=0; i<values.size(); i++ ) {
         Object object = types.get(i);
         if( values.get(i)==UNSET_PARAMETER || object==UNSET_TYPE ) {
            if(reserveFirstParameter && i==0) {
               continue;
            } else {
               throw new QueryException( "Unset positional parameter at position: " + i, getQueryString() );
            }
         }
         positionalValueSpan += ( (Type) object ).getColumnSpan( session.getFactory() );
      positionalValueCount++;               // added
      }


//        if ( positionalParameterCount!=positionalValueSpan ) {               // removed
//            if(reserveFirstParameter && positionalParameterCount-1!=positionalValueSpan) {               // removed
      if ( positionalParameterCount!=positionalValueCount ) {               // added
         if(reserveFirstParameter && positionalParameterCount-1!=positionalValueCount) {               // added
         throw new QueryException(
                   "Expected positional parameter count: " +
                   (positionalParameterCount-1) +
                   ", actual parameters: " +
                   values,
                   getQueryString()
             );
         } else if (!reserveFirstParameter) {
            throw new QueryException(
                   "Expected positional parameter count: " +
                   positionalParameterCount +
                   ", actual parameters: " +
                   values,
                   getQueryString()
             );   
         }         
      }
   }


Top
 Profile  
 
 Post subject: same issue here, hibernate 3.1
PostPosted: Wed Feb 08, 2006 6:44 pm 
Newbie

Joined: Mon Jan 09, 2006 4:44 pm
Posts: 5
I ran into the same issue, where I was specifying 3 params to my HQL query. The first was an entity that has a composite ID, the other two were strings. The error told me that Hibernate expected 3 params, but received 3 for invocation.

I changed my approach to a criteria query. Interestingly, that one worked, even though instead of

setEntity(0, myObject)

I just did

createCriteria(Foo.class)add(Restrictions.eq("otherObject", myObject)....

Matt


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.