You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2009/02/12 17:43:53 UTC

svn commit: r743800 - in /openjpa/branches/1.3.x: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/ openjpa-persistence/src/main...

Author: mikedd
Date: Thu Feb 12 16:43:52 2009
New Revision: 743800

URL: http://svn.apache.org/viewvc?rev=743800&view=rev
Log:
OPENJPA-917 committing patch provided by B.J. Reed

Added:
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestNativeQueryProcedures.java   (with props)
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/DerbyProcedureList.java   (with props)
    openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/ProcedureList.java   (with props)
Modified:
    openjpa/branches/1.3.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java

Added: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestNativeQueryProcedures.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestNativeQueryProcedures.java?rev=743800&view=auto
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestNativeQueryProcedures.java (added)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestNativeQueryProcedures.java Thu Feb 12 16:43:52 2009
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.jdbc.query;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
+import org.apache.openjpa.jdbc.sql.DerbyDictionary;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
+import org.apache.openjpa.persistence.jdbc.query.domain.Applicant;
+import org.apache.openjpa.persistence.jdbc.query.procedure.DerbyProcedureList;
+import org.apache.openjpa.persistence.jdbc.query.procedure.ProcedureList;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+/**
+ * Tests that Native queries use only 1-based positional parameters and 
+ * disallows named parameters.
+ * 
+ * Originally reported in 
+ * <A HRE="http://issues.apache.org/jira/browse/OPENJPA-112>OPENJPA-112</A>
+ *  
+ * @author B.J. Reed
+ *
+ */
+public class TestNativeQueryProcedures extends SingleEMFTestCase {
+    ProcedureList procedureList = null;
+    
+    @Override
+    public void setUp() throws Exception {
+        super.setUp(Applicant.class, CLEAR_TABLES);
+
+        // Figure out which DB we have and get the proper DB Procedure List
+        OpenJPAEntityManagerFactorySPI ojpaEmf = 
+            (OpenJPAEntityManagerFactorySPI) emf;
+        JDBCConfiguration conf = (JDBCConfiguration) ojpaEmf.getConfiguration();
+        
+        if (conf.getDBDictionaryInstance() instanceof DerbyDictionary) {
+            procedureList = new DerbyProcedureList();
+        }
+
+        if (procedureList != null) {
+            EntityManager em = emf.createEntityManager();
+            List<String> createList = procedureList.getCreateProcedureList();
+            try {
+                for (String createProcedure : createList) {
+                    em.getTransaction().begin();
+                    Query query = em.createNativeQuery(createProcedure);
+                    query.executeUpdate();
+                    em.getTransaction().commit();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                em.getTransaction().commit();
+            }
+            em.clear();
+            em.close();
+        }
+    }
+
+    public void tearDown() throws Exception {
+        if (procedureList != null) {
+            EntityManager em = emf.createEntityManager();
+            List<String> dropList = procedureList.getDropProcedureList();
+            try {
+                for (String dropProcedure : dropList) {
+                    em.getTransaction().begin();
+                    Query query = em.createNativeQuery(dropProcedure);
+                    query.executeUpdate();
+                    em.getTransaction().commit();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                em.getTransaction().commit();
+            }
+            em.clear();
+            em.close();
+        }
+        super.tearDown();
+    }
+    
+    public void testNoReturnNoParamProcedure() {
+        if (procedureList != null) {
+            EntityManager em = emf.createEntityManager();
+
+            Applicant applicant1 = new Applicant();
+            applicant1.setName("Charlie");
+            Applicant applicant2 = new Applicant();
+            applicant2.setName("Snoopy");
+
+            em.getTransaction().begin();
+            em.persist(applicant1);
+            em.persist(applicant2);
+            em.getTransaction().commit();
+
+            String sql = procedureList.callAddXToCharlie();
+
+            // query.getSingleResult() and query.getResultList() both throw an
+            // exception: Statement.executeQuery() cannot be called with a
+            // statement that returns a row count
+            try {
+                em.getTransaction().begin();
+                Query query = em.createNativeQuery(sql);
+                query.getSingleResult();
+                em.getTransaction().commit();
+                fail("Expected exception. getSingleResult() with no returns "+ 
+                    "should fail.");
+            } catch (Exception e) {
+                //Expected exception
+                em.getTransaction().rollback();
+            }
+            try {
+                em.getTransaction().begin();
+                Query query = em.createNativeQuery(sql);
+                query.getResultList();
+                em.getTransaction().commit();
+                fail("Expected exception. getResultList() with no returns " + 
+                    "should fail.");
+            } catch (Exception e) {
+                //Expected exception
+                em.getTransaction().rollback();
+            }
+
+            // This one should work properly
+            try {
+                em.getTransaction().begin();
+                Query query = em.createNativeQuery(sql);
+                query.executeUpdate();
+                em.getTransaction().commit();
+            } catch (Exception e) {
+                fail("Caught unexpected exception executing stored procedure: "
+                    + e.getMessage());
+                em.getTransaction().commit();
+            }
+        
+            em.clear();
+            em.close();
+            em = emf.createEntityManager();
+            applicant1 = em.find(Applicant.class, applicant1.getId());
+            applicant2 = em.find(Applicant.class, applicant2.getId());
+
+            // verify one changed and one didn't
+            assertEquals("Charliex", applicant1.getName());
+            assertEquals("Snoopy", applicant2.getName());
+        
+            em.clear();
+            em.close();
+        }
+    }
+}
\ No newline at end of file

Propchange: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestNativeQueryProcedures.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/DerbyProcedureList.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/DerbyProcedureList.java?rev=743800&view=auto
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/DerbyProcedureList.java (added)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/DerbyProcedureList.java Thu Feb 12 16:43:52 2009
@@ -0,0 +1,66 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.jdbc.query.procedure;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.util.ArrayList;
+import java.util.List;
+
+/*
+ * holds the stored procedures that will be used by test cases
+ */
+public class DerbyProcedureList extends ProcedureList {
+
+    public List<String> getCreateProcedureList () {
+        ArrayList<String> retList = new ArrayList<String>();
+
+        retList.add ("create procedure ADD_X_TO_CHARLIE () " +
+                     "PARAMETER STYLE JAVA LANGUAGE JAVA MODIFIES SQL DATA " +
+                     "EXTERNAL NAME 'org.apache.openjpa.persistence.jdbc." + 
+                     "query.procedure.DerbyProcedureList.addXToCharlie'");
+        
+
+        return retList;
+    }
+
+    public List<String> getDropProcedureList () {
+        ArrayList<String> retList = new ArrayList<String>();
+
+        retList.add ("drop procedure ADD_X_TO_CHARLIE");
+
+        return retList;
+    }
+
+    public String callAddXToCharlie () {
+        return "{ call ADD_X_TO_CHARLIE () }";
+    }
+
+    public static void addXToCharlie () throws Exception {
+        Connection conn = DriverManager.getConnection(
+            "jdbc:default:connection");
+        PreparedStatement ps1 = conn.prepareStatement("update APPLICANT set " + 
+            "name = 'Charliex' where name = 'Charlie'");
+        ps1.executeUpdate();
+
+        conn.close();
+    }
+}

Propchange: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/DerbyProcedureList.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/ProcedureList.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/ProcedureList.java?rev=743800&view=auto
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/ProcedureList.java (added)
+++ openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/ProcedureList.java Thu Feb 12 16:43:52 2009
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.jdbc.query.procedure;
+
+import java.util.List;
+
+/*
+ * holds the stored procedures that will be used by test cases
+ */
+public abstract class ProcedureList {
+
+    abstract public List<String> getCreateProcedureList ();
+
+    abstract public List<String> getDropProcedureList ();
+
+    abstract public String callAddXToCharlie ();
+
+    // This method should also be overriden, but it needs to be static so 
+    // that it can be called as a stored procedure
+    public static void addXToCharlie () throws Exception {
+        Exception e = new Exception ("Method not implemented by inheriting " + 
+            "class");
+        throw e;
+    }
+}

Propchange: openjpa/branches/1.3.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/procedure/ProcedureList.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/branches/1.3.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java?rev=743800&r1=743799&r2=743800&view=diff
==============================================================================
--- openjpa/branches/1.3.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java (original)
+++ openjpa/branches/1.3.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java Thu Feb 12 16:43:52 2009
@@ -243,7 +243,8 @@
 	}
 
 	private Object execute() {
-		if (_query.getOperation() != QueryOperations.OP_SELECT)
+		if ((!isNative()) &&
+            _query.getOperation() != QueryOperations.OP_SELECT)
 			throw new InvalidStateException(_loc.get("not-select-query", _query
 					.getQueryString()), null, null, false);