Uploaded image for project: 'OpenJPA'
  1. OpenJPA
  2. OPENJPA-1950

exception when converting datetime2 result from String to java.util.Date (ms sql server)

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Invalid
    • 2.1.0
    • 2.1.0
    • integration, jdbc, third-party
    • None

    Description

      OPENJPA-1759 (included in OpenJPA 2.1.0) added support for datetime2 in sql server. Schema generation uses this type instead of datetime which was generated with earlier versions.
      When I have an entity with a java.util.Date column like:

      @Entity
      public class DateTestEntity {
      ...
      @Temporal(TemporalType.DATE)
      private Date date;
      ...

      Performing the following query with expected result type java.util.Date fails (also happens with OpenJpa 2.0.0 when there is an existing table column of type datetime2).

      "SELECT max(z.date) FROM DateTestEntity z"

      This throws the following exception:

      <openjpa-2.1.0-r422266:1071316 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Failed to execute query "SELECT max(z.date) FROM DateTestEntity z". Check the query syntax for correctness. See nested exception for details.
      at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:872)
      at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794)
      at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
      at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:305)
      at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:319)
      at DateTest.findMaxDate(DateTest.java:96)
      at DateTest.testSelectDate(DateTest.java:41)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at junit.framework.TestCase.runTest(TestCase.java:168)
      at junit.framework.TestCase.runBare(TestCase.java:134)
      at junit.framework.TestResult$1.protect(TestResult.java:110)
      at junit.framework.TestResult.runProtected(TestResult.java:128)
      at junit.framework.TestResult.run(TestResult.java:113)
      at junit.framework.TestCase.run(TestCase.java:124)
      at junit.framework.TestSuite.runTest(TestSuite.java:232)
      at junit.framework.TestSuite.run(TestSuite.java:227)
      at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
      at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
      at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
      Caused by: java.lang.ClassCastException: Cannot convert object "2011-02-22 00:00:00.0000000" of type "class java.lang.String" into an instance of "class java.util.Date".
      at org.apache.openjpa.kernel.Filters.convert(Filters.java:336)
      at org.apache.openjpa.kernel.Filters.convert(Filters.java:265)
      at org.apache.openjpa.jdbc.kernel.exps.UnaryOp.load(UnaryOp.java:125)
      at org.apache.openjpa.jdbc.kernel.ProjectionResultObjectProvider.getResultObject(ProjectionResultObjectProvider.java:78)
      at org.apache.openjpa.kernel.QueryImpl$PackingResultObjectProvider.getResultObject(QueryImpl.java:2075)
      at org.apache.openjpa.kernel.QueryImpl.singleResult(QueryImpl.java:1330)
      at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1242)
      at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1007)
      at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863)
      ... 25 more

      What is weird is that the query "SELECT z.date FROM DateTestEntity z" does correctly convert to java.util.Date.

      Attachments

        1. OPENJPA-1950-TestCase.zip
          2 kB
          Vermeulen

        Issue Links

          Activity

            People

              Unassigned Unassigned
              slowstrider Vermeulen
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: