You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cm...@apache.org on 2011/02/06 23:43:07 UTC

svn commit: r1067791 - in /camel/trunk/components/camel-jpa/src: main/java/org/apache/camel/component/jpa/ test/java/org/apache/camel/component/jpa/

Author: cmueller
Date: Sun Feb  6 22:43:06 2011
New Revision: 1067791

URL: http://svn.apache.org/viewvc?rev=1067791&view=rev
Log:
CAMEL-3634: Add option to set resultClass when using native query with camel-jpa

Added:
    camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNativeQueryWithResultClassTest.java
Modified:
    camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java
    camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/QueryBuilder.java

Modified: camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java?rev=1067791&r1=1067790&r2=1067791&view=diff
==============================================================================
--- camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java (original)
+++ camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaConsumer.java Sun Feb  6 22:43:06 2011
@@ -52,6 +52,7 @@ public class JpaConsumer extends Schedul
     private String query;
     private String namedQuery;
     private String nativeQuery;
+    private Class resultClass;
     private int maxMessagesPerPoll;
     private volatile ShutdownRunningTask shutdownRunningTask;
     private volatile int pendingExchanges;
@@ -242,6 +243,14 @@ public class JpaConsumer extends Schedul
     public void setQuery(String query) {
         this.query = query;
     }
+    
+    public Class getResultClass() {
+        return resultClass;
+    }
+
+    public void setResultClass(Class resultClass) {
+        this.resultClass = resultClass;
+    }    
 
     // Implementation methods
     // -------------------------------------------------------------------------
@@ -278,7 +287,11 @@ public class JpaConsumer extends Schedul
         } else if (namedQuery != null) {
             return QueryBuilder.namedQuery(namedQuery);
         } else if (nativeQuery != null) {
-            return QueryBuilder.nativeQuery(nativeQuery);
+            if (resultClass != null) {
+                return QueryBuilder.nativeQuery(nativeQuery, resultClass);
+            } else {
+                return QueryBuilder.nativeQuery(nativeQuery);                
+            }
         } else {
             Class<?> entityType = endpoint.getEntityType();
             

Modified: camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/QueryBuilder.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/QueryBuilder.java?rev=1067791&r1=1067790&r2=1067791&view=diff
==============================================================================
--- camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/QueryBuilder.java (original)
+++ camel/trunk/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/QueryBuilder.java Sun Feb  6 22:43:06 2011
@@ -82,6 +82,22 @@ public abstract class QueryBuilder imple
             }
         };
     }
+    
+    /**
+     * Creates a native SQL query with a provided resultClass
+     */
+    public static QueryBuilder nativeQuery(final String nativeQuery, final Class resultClass) {
+        return new QueryBuilder() {
+            protected Query makeQueryObject(EntityManager entityManager) {
+                return entityManager.createNativeQuery(nativeQuery, resultClass);
+            }
+
+            @Override
+            public String toString() {
+                return "NativeQuery: " + nativeQuery + " resultClass:" + resultClass + getParameterDescription();
+            }
+        };
+    }
 
     /**
      * Specifies the parameters to the query

Added: camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNativeQueryWithResultClassTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNativeQueryWithResultClassTest.java?rev=1067791&view=auto
==============================================================================
--- camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNativeQueryWithResultClassTest.java (added)
+++ camel/trunk/components/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaWithNativeQueryWithResultClassTest.java Sun Feb  6 22:43:06 2011
@@ -0,0 +1,56 @@
+/**
+ * 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.camel.component.jpa;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.examples.MultiSteps;
+
+/**
+ * @version $Revision: $
+ */
+public class JpaWithNativeQueryWithResultClassTest extends JpaWithNamedQueryTest {
+    
+    /**
+     * We receive a MultiSteps object, because we call entityManager.createNativeQuery(nativeQuery, MultiSteps.class)
+     */
+    @Override
+    protected void assertReceivedResult(Exchange exchange) {
+        assertNotNull(exchange);
+        MultiSteps result = (MultiSteps) exchange.getIn().getBody();
+        assertNotNull("Received an object array", result);
+        assertEquals("address property", "foo@bar.com", result.getAddress());
+    }
+    
+    /**
+     * Is still 1, because we receive an object array which has no @Consumed annotation
+     * as the MultiSteps class has.
+     */
+    @Override
+    protected int getUpdatedStepValue() {
+        return 2;
+    }
+    
+    @Override
+    protected void assertURIQueryOption(JpaConsumer jpaConsumer) {
+        assertEquals("select * from MultiSteps where step = 1", jpaConsumer.getNativeQuery());
+    }
+
+    @Override
+    protected String getEndpointUri() {
+        return "jpa://" + MultiSteps.class.getName() + "?consumer.resultClass=org.apache.camel.examples.MultiSteps&consumer.nativeQuery=select * from MultiSteps where step = 1";
+    }
+}
\ No newline at end of file