svn commit: r678722 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/

1 message Options
Embed this post
Permalink
Pinaki Poddar

svn commit: r678722 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/

Reply Threaded More More options
Print post
Permalink
Author: ppoddar
Date: Tue Jul 22 04:54:26 2008
New Revision: 678722

URL: http://svn.apache.org/viewvc?rev=678722&view=rev
Log:
OPENJPA-660: SQL Query Cache supports binding non-primary key parameters to cached SQL. Commit fix on behalf of Fay Wang. Original test case developed by Vikram Bhatia.

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Department.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/DepartmentId.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Employee.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/EmployeeId.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/FullTimeEmployee.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/PartTimeEmployee.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java
Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java?rev=678722&r1=678721&r2=678722&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java Tue Jul 22 04:54:26 2008
@@ -38,6 +38,7 @@
 import org.apache.openjpa.jdbc.sql.Joins;
 import org.apache.openjpa.jdbc.sql.LogicalUnion;
 import org.apache.openjpa.jdbc.sql.Result;
+import org.apache.openjpa.jdbc.sql.SQLBuffer;
 import org.apache.openjpa.jdbc.sql.Select;
 import org.apache.openjpa.jdbc.sql.SelectExecutor;
 import org.apache.openjpa.jdbc.sql.SelectImpl;
@@ -466,7 +467,7 @@
         SelectImpl sel = null;
         Map<JDBCStoreManager.SelectKey, Object[]> storeCollectionUnionCache = null;
         JDBCStoreManager.SelectKey selKey = null;
-        if (!((JDBCStoreManager)store).isQuerySQLCacheOn())
+        if (!((JDBCStoreManager)store).isQuerySQLCacheOn() || elems.length > 1)
             union = newUnion(sm, store, fetch, elems, resJoins);
         else {
             parmList = new ArrayList();
@@ -503,7 +504,7 @@
                     }
 
                     // only cache the union when elems length is 1 for now
-                    if (!found && elems.length == 1) {
+                    if (!found) {
                         Object[] objs1 = new Object[2];
                         objs1[0] = union;
                         objs1[1] = resJoins[0];
@@ -531,6 +532,9 @@
 
             sel.wherePrimaryKey(mapping, cols, cols, oid, store,
                  null, null, parmList);
+            List nonFKParams = sel.getSQL().getNonFKParameters();
+            if (nonFKParams != null && nonFKParams.size() > 0)
+                parmList.addAll(nonFKParams);
         }
         
         // create proxy

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java?rev=678722&r1=678721&r2=678722&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java Tue Jul 22 04:54:26 2008
@@ -33,6 +33,7 @@
 import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
 import org.apache.openjpa.jdbc.kernel.exps.Val;
 import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ForeignKey;
 import org.apache.openjpa.jdbc.schema.Sequence;
 import org.apache.openjpa.jdbc.schema.Table;
 import serp.util.Numbers;
@@ -55,6 +56,7 @@
     private List _subsels = null;
     private List _params = null;
     private List _cols = null;
+    private List _nonFKParams = null;
 
     /**
      * Default constructor.
@@ -145,6 +147,11 @@
                         _cols.add(paramIndex, null);
             }
         }
+        if (buf._nonFKParams != null) {
+            if (_nonFKParams == null)
+                _nonFKParams = new ArrayList();
+            _nonFKParams.addAll(buf._nonFKParams);
+        }
     }
 
     public SQLBuffer append(Table table) {
@@ -249,6 +256,26 @@
             _params.add(o);
             if (_cols != null)
                 _cols.add(col);
+            if (col == null)
+                return this;
+            boolean isFK = false;
+            ForeignKey[] fks = col.getTable().getForeignKeys();
+            for (int i = 0; i < fks.length; i++) {
+                Column[] cols = fks[i].getColumns();
+                for (int j = 0; j < cols.length; j++) {
+                    if (cols[j] == col) {
+                        isFK = true;
+                        break;
+                    }
+                }
+                if (isFK)
+                    break;
+            }
+            if (!isFK) {
+                if (_nonFKParams == null)
+                    _nonFKParams = new ArrayList();
+                _nonFKParams.add(o);                
+            }
         }
         return this;
     }
@@ -372,6 +399,9 @@
         return (_params == null) ? Collections.EMPTY_LIST : _params;
     }
 
+    public List getNonFKParameters() {
+        return (_nonFKParams == null) ? Collections.EMPTY_LIST : _nonFKParams;
+    }
     /**
      * Return the SQL for this buffer.
      */

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Department.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Department.java?rev=678722&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Department.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Department.java Tue Jul 22 04:54:26 2008
@@ -0,0 +1,83 @@
+/*
+ * 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.cache;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import org.apache.openjpa.persistence.jdbc.ElementClassCriteria;
+
+/**
+ * Persistent entity with collection whose element type belongs to inheritance
+ * hierarchy mapped to a SINGLE_TABLE. Hence relationship loading will require
+ *
+ */
+@Entity
+@Table(name = "DEPT")
+@IdClass(DepartmentId.class)
+public class Department {
+
+ @Id
+ private String name;
+
+ @OneToMany(mappedBy = "dept", cascade = CascadeType.PERSIST)
+ @ElementClassCriteria
+ private Collection<PartTimeEmployee> partTimeEmployees;
+
+ @OneToMany(mappedBy = "dept", cascade = CascadeType.PERSIST)
+ @ElementClassCriteria
+ private Collection<FullTimeEmployee> fullTimeEmployees;
+
+ public Collection<FullTimeEmployee> getFullTimeEmployees() {
+ return fullTimeEmployees;
+ }
+
+ public void addEmployee(FullTimeEmployee e) {
+ if (fullTimeEmployees == null)
+ fullTimeEmployees = new ArrayList<FullTimeEmployee>();
+ this.fullTimeEmployees.add(e);
+ e.setDept(this);
+ }
+
+ public Collection<PartTimeEmployee> getPartTimeEmployees() {
+ return partTimeEmployees;
+ }
+
+ public void addEmployee(PartTimeEmployee e) {
+ if (partTimeEmployees == null)
+ partTimeEmployees = new ArrayList<PartTimeEmployee>();
+ this.partTimeEmployees.add(e);
+ e.setDept(this);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/DepartmentId.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/DepartmentId.java?rev=678722&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/DepartmentId.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/DepartmentId.java Tue Jul 22 04:54:26 2008
@@ -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.openjpa.persistence.jdbc.query.cache;
+
+import java.io.Serializable;
+
+public class DepartmentId implements Serializable {
+ private String name;
+
+ public DepartmentId() {
+ this(null);
+ }
+
+ public DepartmentId(String name) {
+ this.name = name;
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof DepartmentId)) {
+ return false;
+ }
+
+ DepartmentId other = (DepartmentId) obj;
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ } else if (!name.equals(other.name)) {
+ return false;
+ }
+ return true;
+ }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Employee.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Employee.java?rev=678722&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Employee.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Employee.java Tue Jul 22 04:54:26 2008
@@ -0,0 +1,59 @@
+/*
+ * 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.cache;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "EMP")
+@IdClass(EmployeeId.class)
+@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+@DiscriminatorColumn(name = "TYPE")
+public abstract class Employee {
+
+ @Id
+ private String ssn;
+
+ @ManyToOne
+ private Department dept;
+
+ public String getSsn() {
+ return ssn;
+ }
+
+ public void setSsn(String ssn) {
+ this.ssn = ssn;
+ }
+
+ public Department getDept() {
+ return dept;
+ }
+
+ public void setDept(Department dept) {
+ this.dept = dept;
+ }
+
+}
\ No newline at end of file

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/EmployeeId.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/EmployeeId.java?rev=678722&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/EmployeeId.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/EmployeeId.java Tue Jul 22 04:54:26 2008
@@ -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.openjpa.persistence.jdbc.query.cache;
+
+import java.io.Serializable;
+
+public class EmployeeId implements Serializable {
+
+ private String ssn;
+
+ public EmployeeId(){
+ }
+ public EmployeeId(String ssn){
+ this.ssn = ssn;
+ }
+    public boolean equals (Object other)
+    {
+        if (other == this)
+            return true;
+        if (!(other instanceof EmployeeId))
+            return false;
+
+        EmployeeId obj = (EmployeeId) other;
+ if (ssn == null) {
+ if (obj.ssn != null) {
+ return false;
+ }
+ } else if (!ssn.equals(obj.ssn)) {
+ return false;
+ }
+
+        return (true);
+    }
+    
+  
+    public int hashCode ()
+    {
+        return (ssn.hashCode());
+    }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/FullTimeEmployee.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/FullTimeEmployee.java?rev=678722&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/FullTimeEmployee.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/FullTimeEmployee.java Tue Jul 22 04:54:26 2008
@@ -0,0 +1,38 @@
+/*
+ * 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.cache;
+
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+@Entity
+@DiscriminatorValue("F")
+public class FullTimeEmployee extends Employee {
+ @Column(name = "salary")
+ private double salary;
+
+ public double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(double salary) {
+ this.salary = salary;
+ }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/PartTimeEmployee.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/PartTimeEmployee.java?rev=678722&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/PartTimeEmployee.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/PartTimeEmployee.java Tue Jul 22 04:54:26 2008
@@ -0,0 +1,38 @@
+/*
+ * 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.cache;
+
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+@Entity
+@DiscriminatorValue("P")
+public class PartTimeEmployee extends Employee {
+ @Column(name = "wage")
+ private double hourlyWage;
+
+ public double getHourlyWage() {
+ return hourlyWage;
+ }
+
+ public void setHourlyWage(double hourlyWage) {
+ this.hourlyWage = hourlyWage;
+ }
+}

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java?rev=678722&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java Tue Jul 22 04:54:26 2008
@@ -0,0 +1,157 @@
+/*
+ * 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.cache;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.apache.openjpa.persistence.test.SQLListenerTestCase;
+
+/**
+ * Tests that find() queries that use non-primary keys can be cached.
+ *
+ * SQL Query Cache caches SQL queries generated to select single entity.
+ * However, single instance queries may also join to other relations. Hence,
+ * primary key and foreign keys are normally the parameters to these queries
+ * which cached query binds again when being reused.
+ *
+ * The test verifies the case where non-primary keys are used as query
+ * parameters. The test employs a inheritance hierarchy mapped to SINGLE_TABLE.
+ * When derived instances are used in relationship, the discriminator values
+ * must be used in to join to the target type.
+ *
+ * For further details, refer <A
+ * HREF="https://issues.apache.org/jira/browse/OPENJPA-660">OPENJPA-660</A>
+ *
+ *
+ * @author Pinaki Poddar
+ * @author Vikram Bhatia
+ *
+ */
+public class TestNonPrimaryKeyQueryParameters extends SQLListenerTestCase {
+ private static final int FULLTIME_EMPLOYEE_COUNT = 3;
+ private static final int PARTTIME_EMPLOYEE_COUNT = 2;
+ private static final String DEPT_NAME = "ENGINEERING";
+
+ public void setUp() {
+ super.setUp(CLEAR_TABLES, Department.class, Employee.class,
+ FullTimeEmployee.class, PartTimeEmployee.class,
+ "openjpa.jdbc.QuerySQLCache", "true");
+ createDepartment(DEPT_NAME);
+ sql.clear();
+ }
+
+ public void testSelectQueryWithPrimaryKeyParameter() {
+ EntityManager em = emf.createEntityManager();
+
+ Query query = em
+ .createQuery("SELECT d from Department d where d.name=?1");
+ query.setParameter(1, DEPT_NAME);
+ Department dept = (Department) query.getSingleResult();
+
+ assertEquals(FULLTIME_EMPLOYEE_COUNT, dept.getFullTimeEmployees()
+ .size());
+ assertEquals(PARTTIME_EMPLOYEE_COUNT, dept.getPartTimeEmployees()
+ .size());
+ assertSQL(".* AND t0.TYPE = .*");
+ em.close();
+ }
+
+ public void testSelectQueryWithNoParameter() {
+ EntityManager em = emf.createEntityManager();
+
+ Query query = em.createQuery("SELECT d from Department d");
+ query.setParameter(1, DEPT_NAME);
+ Department dept = (Department) query.getSingleResult();
+
+ assertEquals(FULLTIME_EMPLOYEE_COUNT, dept.getFullTimeEmployees()
+ .size());
+ assertEquals(PARTTIME_EMPLOYEE_COUNT, dept.getPartTimeEmployees()
+ .size());
+
+ assertSQL(".* AND t0.TYPE = .*");
+ em.close();
+ }
+
+ public void testFind() {
+ EntityManager em = emf.createEntityManager();
+
+ Department dept = em.find(Department.class, DEPT_NAME);
+
+ assertEquals(FULLTIME_EMPLOYEE_COUNT, dept.getFullTimeEmployees()
+ .size());
+ assertEquals(PARTTIME_EMPLOYEE_COUNT, dept.getPartTimeEmployees()
+ .size());
+
+ assertSQL(".* AND t0.TYPE = .*");
+ em.close();
+ }
+
+ public void testSelectSubClass() {
+ EntityManager em = emf.createEntityManager();
+
+ Query query = em.createQuery("SELECT e from FullTimeEmployee e");
+ assertEquals(FULLTIME_EMPLOYEE_COUNT, query.getResultList().size());
+
+ query = em.createQuery("SELECT e from PartTimeEmployee e");
+ assertEquals(PARTTIME_EMPLOYEE_COUNT, query.getResultList().size());
+
+ assertSQL(".* WHERE t0.TYPE = .*");
+ }
+
+ public void testSelectBaseClass() {
+ EntityManager em = emf.createEntityManager();
+
+ Query query = em.createQuery("SELECT e from Employee e");
+ assertEquals(FULLTIME_EMPLOYEE_COUNT + PARTTIME_EMPLOYEE_COUNT, query
+ .getResultList().size());
+ assertNotSQL(".* WHERE t0.TYPE = .*");
+ }
+
+ private void createDepartment(String deptName) {
+ if (count(Department.class) > 0)
+ return;
+
+ Department dept = new Department();
+ dept.setName(deptName);
+
+ for (int i = 1; i <= FULLTIME_EMPLOYEE_COUNT; i++) {
+ FullTimeEmployee e = new FullTimeEmployee();
+ e.setSsn("888-PP-001" + i);
+ e.setSalary(100000);
+ dept.addEmployee(e);
+ }
+ for (int i = 1; i <= PARTTIME_EMPLOYEE_COUNT; i++) {
+ PartTimeEmployee e = new PartTimeEmployee();
+ e.setSsn("999-PP-001" + i);
+ e.setHourlyWage(20);
+ dept.addEmployee(e);
+ }
+
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+ em.persist(dept);
+ em.getTransaction().commit();
+ em.close();
+
+ }
+}


Pinaki