You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2010/02/09 19:36:12 UTC
svn commit: r908150 - in /openjpa/trunk:
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdb...
Author: faywang
Date: Tue Feb 9 18:36:10 2010
New Revision: 908150
URL: http://svn.apache.org/viewvc?rev=908150&view=rev
Log:
OPENJPA-1496: fix temporal parameter processing
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/TimeEntity.java (with props)
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestTemporalTypeQueryParameterBinding.java
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java?rev=908150&r1=908149&r2=908150&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Filters.java Tue Feb 9 18:36:10 2010
@@ -238,6 +238,12 @@
return !strict;
if (c1 == String.class && isTemporalType(c2))
return true;
+ if ((c1 == java.util.Date.class ||c1 == java.sql.Time.class) && c2 == java.sql.Timestamp.class)
+ return false;
+ if ((c1 == java.util.Date.class ||c1 == java.sql.Timestamp.class) && c2 == java.sql.Time.class)
+ return false;
+ if (isTemporalType(c1) && isTemporalType(c2))
+ return true;
return false;
}
@@ -972,7 +978,8 @@
return c != null
&& (Date.class.isAssignableFrom(c)
|| Time.class.isAssignableFrom(c)
- || Timestamp.class.isAssignableFrom(c));
+ || Timestamp.class.isAssignableFrom(c)
+ || Calendar.class.isAssignableFrom(c));
}
public static Object getDefaultForNull(Class<?> nType) {
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestTemporalTypeQueryParameterBinding.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestTemporalTypeQueryParameterBinding.java?rev=908150&r1=908149&r2=908150&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestTemporalTypeQueryParameterBinding.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestTemporalTypeQueryParameterBinding.java Tue Feb 9 18:36:10 2010
@@ -28,6 +28,7 @@
import javax.persistence.TemporalType;
import org.apache.openjpa.persistence.ArgumentException;
+import org.apache.openjpa.persistence.jdbc.query.domain.TimeEntity;
import org.apache.openjpa.persistence.jdbc.query.domain.TimeKeeper;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
@@ -63,16 +64,27 @@
private EntityManager em;
@Override
public void setUp() throws Exception {
- super.setUp(CLEAR_TABLES, TimeKeeper.class);
+ super.setUp(CLEAR_TABLES, TimeKeeper.class, TimeEntity.class);
em = emf.createEntityManager();
TimeKeeper pc = new TimeKeeper();
pc.setDate(VALUE_DATE);
pc.setTime(VALUE_TIME);
pc.setTstamp(VALUE_TSTAMP);
-
+
+ TimeEntity te = new TimeEntity();
+ te.setName("name1");
+ te.setValue(1);
+ te.setCal2Timestamp(PARAM_CALENDAR);
+ te.setCal2Time(PARAM_CALENDAR);
+ te.setCal2Date(PARAM_CALENDAR);
+ te.setUDate2SDate(VALUE_DATE);
+ te.setUDate2Time(VALUE_DATE);
+ te.setUDate2Timestamp(VALUE_DATE);
+
em.getTransaction().begin();
em.persist(pc);
+ em.persist(te);
em.getTransaction().commit();
}
@@ -173,7 +185,61 @@
}
}
- void verifyParams(String jpql, Class<? extends Exception> error,
+ public void testTemporalType() {
+ EntityManager em = emf.createEntityManager();
+ Calendar endTime = PARAM_CALENDAR;
+ Calendar startTime = PARAM_CALENDAR;
+ startTime.add(14, -4);
+
+ //(1) Calendar to Timestamp
+ String jpql = "SELECT COUNT(a) FROM TimeEntity a WHERE a.cal2Timestamp BETWEEN ?1 AND ?2";
+ Query q = em.createQuery(jpql);
+ assertSetTemporalParameter(q, 1, startTime, TemporalType.TIMESTAMP);
+ assertSetTemporalParameter(q, 2, endTime, TemporalType.TIMESTAMP);
+ assertEquals(1, q.getResultList().size());
+
+ //(2) Calendar to Time
+ jpql = "SELECT COUNT(a) FROM TimeEntity a WHERE a.cal2Time BETWEEN ?1 AND ?2";
+ q = em.createQuery(jpql);
+ assertSetTemporalParameter(q, 1, startTime, TemporalType.TIME);
+ assertSetTemporalParameter(q, 2, endTime, TemporalType.TIME);
+ assertEquals(1, q.getResultList().size());
+
+ //(3)Calendar to Date
+ jpql = "SELECT COUNT(a) FROM TimeEntity a WHERE a.cal2Date BETWEEN ?1 AND ?2";
+ q = em.createQuery(jpql);
+ assertSetTemporalParameter(q, 1, startTime, TemporalType.DATE);
+ assertSetTemporalParameter(q, 2, endTime, TemporalType.DATE);
+ q.setParameter(1, startTime, TemporalType.DATE);
+ q.setParameter(2, endTime, TemporalType.DATE);
+ assertEquals(1, q.getResultList().size());
+
+ //(4)Date to Timestamp
+ java.util.Date endDate = VALUE_DATE;
+ java.util.Date startDate = new Date(T1 - 1000);
+ jpql = "SELECT COUNT(a) FROM TimeEntity a WHERE a.udate2Timestamp BETWEEN ?1 AND ?2";
+ q = em.createQuery(jpql);
+ assertSetTemporalParameter(q, 1, startDate, TemporalType.TIMESTAMP);
+ assertSetTemporalParameter(q, 2, endDate, TemporalType.TIMESTAMP);
+ assertEquals(1, q.getResultList().size());
+
+ //(5) Date to Time
+ jpql = "SELECT COUNT(a) FROM TimeEntity a WHERE a.udate2Time BETWEEN ?1 AND ?2";
+ q = em.createQuery(jpql);
+ assertSetTemporalParameter(q, 1, startDate, TemporalType.TIME);
+ assertSetTemporalParameter(q, 2, endDate, TemporalType.TIME);
+ assertEquals(1, q.getResultList().size());
+
+ //(6) Date to Date
+ jpql = "SELECT COUNT(a) FROM TimeEntity a WHERE a.udate2SDate BETWEEN ?1 AND ?2";
+ q = em.createQuery(jpql);
+ assertSetTemporalParameter(q, 1, startDate, TemporalType.DATE);
+ assertSetTemporalParameter(q, 2, endDate, TemporalType.DATE);
+ assertEquals(1, q.getResultList().size());
+ }
+
+
+ void verifyParams(String jpql, Class<? extends Exception> error,
Object... params) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
@@ -198,4 +264,22 @@
}
em.getTransaction().commit();
}
+
+ void assertSetTemporalParameter(Query q, int pos, Date v, TemporalType temporalType) {
+ try {
+ q.setParameter(pos, v, temporalType);
+ } catch (Exception e) {
+ fail("Fail in setting positional parameter [" + pos + "] to a value of " + v);
+ }
+ }
+
+ void assertSetTemporalParameter(Query q, int pos, Calendar v, TemporalType temporalType) {
+ try {
+ q.setParameter(pos, v, temporalType);
+ } catch (Exception e) {
+ fail("Fail in setting positional parameter [" + pos + "] to a value of " + v);
+ }
+ }
+
+
}
Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/TimeEntity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/TimeEntity.java?rev=908150&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/TimeEntity.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/TimeEntity.java Tue Feb 9 18:36:10 2010
@@ -0,0 +1,133 @@
+/*
+ * 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.domain;
+
+import java.util.Calendar;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+public class TimeEntity {
+ @Id
+ @GeneratedValue
+ private long id;
+
+ String name;
+
+ int value;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ private java.util.Calendar cal2Timestamp;
+
+ @Temporal(TemporalType.TIME)
+ private java.util.Calendar cal2Time;
+
+ @Temporal(TemporalType.DATE)
+ private java.util.Calendar cal2Date;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ private java.util.Date udate2Timestamp;
+
+ @Temporal(TemporalType.TIME)
+ private java.util.Date udate2Time;
+
+ @Temporal(TemporalType.DATE)
+ private java.util.Date udate2SDate;
+
+ public TimeEntity() {
+ }
+
+ public TimeEntity(int id, String name, int value) {
+ this.id = id;
+ this.name = name;
+ this.value = value;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+
+ public Calendar getCal2Timestamp() {
+ return cal2Timestamp;
+ }
+
+ public void setCal2Timestamp(Calendar cal2Timestamp) {
+ this.cal2Timestamp = cal2Timestamp;
+ }
+
+ public Calendar getCal2Time() {
+ return cal2Time;
+ }
+
+ public void setCal2Time(Calendar cal2Time) {
+ this.cal2Time = cal2Time;
+ }
+
+ public Calendar getCal2Date() {
+ return cal2Date;
+ }
+
+ public void setCal2Date(Calendar cal2Date) {
+ this.cal2Date = cal2Date;
+ }
+
+ public java.util.Date getUDate2Timestamp() {
+ return udate2Timestamp;
+ }
+
+ public void setUDate2Timestamp(java.util.Date udate2Timestamp) {
+ this.udate2Timestamp = udate2Timestamp;
+ }
+
+ public java.util.Date getUDate2Time() {
+ return udate2Time;
+ }
+
+ public void setUDate2Time(java.util.Date udate2Time) {
+ this.udate2Time = udate2Time;
+ }
+
+ public java.util.Date getUDate2SDate() {
+ return udate2SDate;
+ }
+
+ public void setUDate2SDate(java.util.Date udate2SDate) {
+ this.udate2SDate = udate2SDate;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/TimeEntity.java
------------------------------------------------------------------------------
svn:eol-style = native