From 49d529bad878d33c667f8ab8582f02d053885420 Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Wed, 11 Nov 2009 22:20:48 +0000 Subject: [PATCH] HHH-4567 - EntiytManager's QueryImpl mishandles ordinal position of HQL-style positional parameters git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@17961 1b8cb986-b30d-0410-93ca-fae66ebed9b2 --- .../java/org/hibernate/ejb/QueryImpl.java | 8 ++--- .../org/hibernate/ejb/test/QueryTest.java | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java b/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java index c7f0c76c5b..59d09e0d7b 100755 --- a/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java +++ b/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java @@ -75,7 +75,7 @@ public class QueryImpl extends org.hibernate.ejb.AbstractQueryImpl impleme extractParameterInfo(); } - @SuppressWarnings({ "unchecked" }) + @SuppressWarnings({ "unchecked", "RedundantCast" }) private void extractParameterInfo() { if ( ! AbstractQueryImpl.class.isInstance( query ) ) { throw new IllegalStateException( "Unknown query type for parameter extraction" ); @@ -108,7 +108,7 @@ public class QueryImpl extends org.hibernate.ejb.AbstractQueryImpl impleme final OrdinalParameterDescriptor descriptor = queryImpl.getParameterMetadata().getOrdinalParameterDescriptor( i+1 ); ParameterImpl parameter = new ParameterImpl( - descriptor.getOrdinalPosition() + 1, + i + 1, descriptor.getExpectedType() == null ? null : descriptor.getExpectedType().getReturnedClass() @@ -204,7 +204,7 @@ public class QueryImpl extends org.hibernate.ejb.AbstractQueryImpl impleme /** * {@inheritDoc} */ - @SuppressWarnings({ "unchecked" }) + @SuppressWarnings({ "unchecked", "RedundantCast" }) public List getResultList() { try { return (List) query.list(); @@ -223,7 +223,7 @@ public class QueryImpl extends org.hibernate.ejb.AbstractQueryImpl impleme /** * {@inheritDoc} */ - @SuppressWarnings({ "unchecked" }) + @SuppressWarnings({ "unchecked", "RedundantCast" }) public X getSingleResult() { try { boolean mucked = false; diff --git a/entitymanager/src/test/java/org/hibernate/ejb/test/QueryTest.java b/entitymanager/src/test/java/org/hibernate/ejb/test/QueryTest.java index ce7b540826..a221703fb0 100644 --- a/entitymanager/src/test/java/org/hibernate/ejb/test/QueryTest.java +++ b/entitymanager/src/test/java/org/hibernate/ejb/test/QueryTest.java @@ -212,6 +212,40 @@ public class QueryTest extends TestCase { em.close(); } + public void testPositionalParameterForms() throws Exception { + EntityManager em = getOrCreateEntityManager(); + em.getTransaction().begin(); + Wallet w = new Wallet(); + w.setBrand( "Lacoste" ); + w.setModel( "Minimic" ); + w.setSerial( "0100202002" ); + em.persist( w ); + em.getTransaction().commit(); + + em.getTransaction().begin(); + // first using jpa-style positional parameter + Query query = em.createQuery( "select w from Wallet w where w.brand = ?1" ); + query.setParameter( 1, "Lacoste" ); + w = (Wallet) query.getSingleResult(); + assertNotNull( w ); + + // next using jpa-style positional parameter, but as a name (which is how Hibernate core treats these + query = em.createQuery( "select w from Wallet w where w.brand = ?1" ); + query.setParameter( "1", "Lacoste" ); + w = (Wallet) query.getSingleResult(); + assertNotNull( w ); + + // finally using hql-style positional parameter + query = em.createQuery( "select w from Wallet w where w.brand = ?" ); + query.setParameter( 1, "Lacoste" ); + w = (Wallet) query.getSingleResult(); + assertNotNull( w ); + + em.remove( w ); + em.getTransaction().commit(); + em.close(); + } + public void testNativeQuestionMarkParameter() throws Exception { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin();