[hibernate-issues] [Hibernate-JIRA] Commented: (EJB-361) Query#setParameter(int position, Object value) wrong implementation
John Sublette (JIRA)
noreply at atlassian.com
Fri Aug 7 14:41:14 EDT 2009
[ http://opensource.atlassian.com/projects/hibernate/browse/EJB-361?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=33728#action_33728 ]
John Sublette commented on EJB-361:
-----------------------------------
I just ran into what looks like this problem also. I tracked it down to the QueryImpl.isPositionalParameter() function. It looks to me like the comments don't match the code.
According to the code, the following queryStrings should return:
"SELECT Foo FROM Foo WHERE Foo.param1 = :value" TRUE (index == -1, Should have been false, right?)
"SELECT Foo FROM Foo WHERE Foo.param1 = ?" FALSE (found index is last char, Should have been true, right?)
"SELECT Foo FROM Foo WHERE Foo.param1 = ?1" TRUE (found index is followed by a digit)
I noticed this problem when I tried using a query similar to the first (by name) but was trying to set the parameters by index (similar to Fabrice Daugan). It looks like it would work correctly if the return values were swapped for the first two cases.
private boolean isPositionalParameter() {
256 if (isPositional == null) {
257 //compute it
258 String queryString = query.getQueryString();
259 int index = queryString.indexOf( '?' );
260 //there is a ? and the following char is a digit
261 if (index == -1) {
262 //no ?
263 isPositional = true;
264 }
265 else if ( index == queryString.length() - 1 ) {
266 // "... ?"
267 isPositional = false;
268 }
269 else {
270 isPositional = Character.isDigit( queryString.charAt( index + 1 ) );
271 }
272 }
273 return isPositional;
274 }
275
> Query#setParameter(int position, Object value) wrong implementation
> -------------------------------------------------------------------
>
> Key: EJB-361
> URL: http://opensource.atlassian.com/projects/hibernate/browse/EJB-361
> Project: Hibernate Entity Manager
> Issue Type: Bug
> Components: EntityManager
> Affects Versions: 3.3.2.GA
> Reporter: Fabrice Daugan
> Original Estimate: 2 hours
> Remaining Estimate: 2 hours
>
> The Hibernate JPA javax.persistence.Query#setParameter(int position, Object value) implementation does not suit to the JPA specicafication.
> Indeed, the actual integer passed to the operation is converted to String by Hibernate and then used to find the named parameter.
> Please have a look to the folowing stack trace :
> java.lang.Thread.run(Thread.java:619)
> Caused by: java.lang.IllegalArgumentException:
> org.hibernate.QueryParameterException: could not locate named parameter [1]
> at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:185)
> at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:240)
> at org.springframework.orm.jpa.JpaTemplate$9.doInJpa(JpaTemplate.java:316)
> To repoduce this error :
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list