|
View:
New views
3 Messages
—
Rating Filter:
Alert me
|
|
|
Wrong cast for @Converted column in where-clauseTrying to implement a Boolean object as a String(Y/N) in an AS/400 DB I encountered the following error-message: Local Exception Stack: Exception [EclipseLink-4002] (Eclipse Persistence Services - 1.1 (Build SNAPSHOT - 20080813)): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: Data type mismatch. Error Code: -99999 Call: SELECT VRSNR, LBLID, VRAKK, VRAKT, CMCDT, CMCRE, CMCWK, CMMDT, CMMTE, CMMTU, CMMTM, CMMWK, LBADR, LBADV, LNDCD, LBNAM, LBNMV, LBPCD, LBSWF, LBWPL, LBWPV FROM LBV WHERE (((LBLID = CAST (? AS INTEGER )) AND (VRAKT = CAST (? AS SMALLINT ))) AND (VRAKK = CAST (? AS SMALLINT ))) bind => [951, Y, Y] Query: ReadAllQuery(com.koopmanint.loc.persistent.LetterOfCreditBankVersie) at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:322) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1358) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:638) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:500) at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:522) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:205) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:191) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:262) at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:599) at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2505) at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2463) at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:478) at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:883) at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:666) at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:844) at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:456) at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:906) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2590) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1178) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1249) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1249) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1249) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1249) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1162) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1136) at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1118) at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:399) at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:517) at com.koopmanint.loc.servicebeans.LetterOfCreditBankServiceBean.findVersions(LetterOfCreditBankServiceBean.java:58) at com.koopmanint.loc.servicebeans.LetterOfCreditBankServiceBean.findActive(LetterOfCreditBankServiceBean.java:66) at com.koopmanint.loc.servicebeans.LetterOfCreditBankServiceBeanTest.testFindNonexistentActiveBank(LetterOfCreditBankServiceBeanTest.java:37) 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:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) Caused by: java.sql.SQLException: Data type mismatch. at com.ibm.as400.access.JDError.throwSQLException(JDError.java:389) at com.ibm.as400.access.SQLSmallint.set(SQLSmallint.java:163) at com.ibm.as400.access.AS400JDBCPreparedStatement.setValue(AS400JDBCPreparedStatement.java:2952) at com.ibm.as400.access.AS400JDBCPreparedStatement.setString(AS400JDBCPreparedStatement.java:2602) at org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.setParameterValueInDatabaseCall(DatabasePlatform.java:1734) at org.eclipse.persistence.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:664) at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:550) ... 44 more The definitions are: POJO: @ObjectTypeConverter ( name="BooleanConverter", dataType=java.lang.String.class, objectType=java.lang.Boolean.class, conversionValues={ @ConversionValue(dataValue="Y", objectValue="true") , @ConversionValue(dataValue="N", objectValue="false") } ) @Convert("BooleanConverter") @Column(name = "VRAKK") private Boolean akkoord; @Convert("BooleanConverter") @Column(name = "VRAKT") private Boolean aktief; Query: query = "SELECT lbv FROM LetterOfCreditBankVersie lbv " + "WHERE lbv.bankId = :bankId " + "AND lbv.aktief = :aktief " + "AND lbv.akkoord = :akkoord ") Call method: private List<LetterOfCreditTekstVersie> findVersions(Integer tekstId, Boolean aktief, Boolean akkoord) { return getEm().createNamedQuery("LetterOfCreditTekstVersie.byIdStatus"). setParameter("tekstId", tekstId). setParameter("aktief", aktief). setParameter("akkoord", akkoord). getResultList(); } What strikes me is that a simple query and persisting an object is no problem (Java-Boolean gets converted to DB-String and back), but when I query using a Boolean-parameter this parameter-value is not CAST-ed to String but to SMALLINT (some default implementation for Boolean?) .. Is it true that when casting a parameter the dataType from the ObjectTypeConverter-definition is ignored? A bug? Thnx, Bob _______________________________________________ eclipselink-users mailing list eclipselink-users@... https://dev.eclipse.org/mailman/listinfo/eclipselink-users |
|||||||||||
|
|
Re: Wrong cast for @Converted column in where-clauseDefinitely appears to be a bug, please log the issue.
In fact it should not even be putting the cast in this case, as the cast is only required for certain functions. From the code the issue is the type in ParameterExpression is wrong, it is from the JPQL, instead of from the localBase mapping field type. As a workaround, you could probably remove the casting in your own DB2Platform subclass, as it is normally not required.
James Sutherland EclipseLink, TopLink Wiki: EclipseLink, TopLink Forums: TopLink, EclipseLink Book: Java Persistence |
|||||||||||
|
|
Re: Wrong cast for @Converted column in where-clauseHi James, Thanks for the reply. I have reported this as bug. As a workaround I created: - a sub-class for DB2Platform overriding the writeParameterMarker-method w/o the casting - added property name=eclipselink.target-database value=<path.to.myClass> to the persistence.xml and now it works :-) Bob
Definitely appears to be a bug, please log the issue. In fact it should not even be putting the cast in this case, as the cast is only required for certain functions. >From the code the issue is the type in ParameterExpression is wrong, it is from the JPQL, instead of from the localBase mapping field type. As a workaround, you could probably remove the casting in your own DB2Platform subclass, as it is normally not required. Bob Sloots wrote: > > Trying to implement a Boolean object as a String(Y/N) in an AS/400 DB I > encountered the following error-message: > > Local Exception Stack: > Exception [EclipseLink-4002] (Eclipse Persistence Services - 1.1 (Build > SNAPSHOT - 20080813)): > org.eclipse.persistence.exceptions.DatabaseException > Internal Exception: java.sql.SQLException: Data type mismatch. > Error Code: -99999 > Call: SELECT VRSNR, LBLID, VRAKK, VRAKT, CMCDT, CMCRE, CMCWK, CMMDT, > CMMTE, CMMTU, CMMTM, CMMWK, LBADR, LBADV, LNDCD, LBNAM, LBNMV, LBPCD, > LBSWF, LBWPL, LBWPV FROM LBV WHERE (((LBLID = CAST (? AS INTEGER )) AND > (VRAKT = CAST (? AS SMALLINT ))) AND (VRAKK = CAST (? AS SMALLINT ))) > bind => [951, Y, Y] > Query: > ReadAllQuery(com.koopmanint.loc.persistent.LetterOfCreditBankVersie) > at > org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:322) > at > org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1358) > at > org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:638) > at > org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:500) > at > org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:522) > at > org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:205) > at > org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:191) > at > org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:262) > at > org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:599) > at > org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2505) > at > org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2463) > at > org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:478) > at > org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:883) > at > org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:666) > at > org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:844) > at > org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:456) > at > org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:906) > at > org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2590) > at > org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1178) > at > org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1249) > at > org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1249) > at > org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1249) > at > org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1249) > at > org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1162) > at > org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1136) > at > org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1118) > at > org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:399) > at > org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:517) > at > com.koopmanint.loc.servicebeans.LetterOfCreditBankServiceBean.findVersions(LetterOfCreditBankServiceBean.java:58) > at > com.koopmanint.loc.servicebeans.LetterOfCreditBankServiceBean.findActive(LetterOfCreditBankServiceBean.java:66) > at > com.koopmanint.loc.servicebeans.LetterOfCreditBankServiceBeanTest.testFindNonexistentActiveBank(LetterOfCreditBankServiceBeanTest.java:37) > 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:154) > at junit.framework.TestCase.runBare(TestCase.java:127) > at junit.framework.TestResult$1.protect(TestResult.java:106) > at junit.framework.TestResult.runProtected(TestResult.java:124) > at junit.framework.TestResult.run(TestResult.java:109) > at junit.framework.TestCase.run(TestCase.java:118) > at > org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) > at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) > Caused by: java.sql.SQLException: Data type mismatch. > at > com.ibm.as400.access.JDError.throwSQLException(JDError.java:389) > at com.ibm.as400.access.SQLSmallint.set(SQLSmallint.java:163) > at > com.ibm.as400.access.AS400JDBCPreparedStatement.setValue(AS400JDBCPreparedStatement.java:2952) > at > com.ibm.as400.access.AS400JDBCPreparedStatement.setString(AS400JDBCPreparedStatement.java:2602) > at > org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.setParameterValueInDatabaseCall(DatabasePlatform.java:1734) > at > org.eclipse.persistence.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:664) > at > org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:550) > ... 44 more > > The definitions are: > > POJO: > > @ObjectTypeConverter ( > name="BooleanConverter", > dataType=java.lang.String.class, > objectType=java.lang.Boolean.class, > conversionValues={ > @ConversionValue(dataValue="Y", objectValue="true") , > @ConversionValue(dataValue="N", objectValue="false") } > ) > > @Convert("BooleanConverter") > @Column(name = "VRAKK") > private Boolean akkoord; > > @Convert("BooleanConverter") > @Column(name = "VRAKT") > private Boolean aktief; > > Query: > > query = "SELECT lbv FROM LetterOfCreditBankVersie lbv " + > "WHERE lbv.bankId = :bankId " + > "AND lbv.aktief = :aktief " + > "AND lbv.akkoord = :akkoord ") > > Call method: > > private List<LetterOfCreditTekstVersie> findVersions(Integer tekstId, > Boolean aktief, Boolean akkoord) { > return getEm().createNamedQuery( > "LetterOfCreditTekstVersie.byIdStatus"). > setParameter("tekstId", tekstId). > setParameter("aktief", aktief). > setParameter("akkoord", akkoord). > getResultList(); > } > > What strikes me is that a simple query and persisting an object is no > problem (Java-Boolean gets converted to DB-String and back), but when I > query using a Boolean-parameter this parameter-value is not CAST-ed to > String but to SMALLINT (some default implementation for Boolean?) .. > Is it true that when casting a parameter the dataType from the > ObjectTypeConverter-definition is ignored? > A bug? > > Thnx, > > Bob > > ----- http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland http://www.eclipse.org/eclipselink/ EclipseLink , http://www.oracle.com/technology/products/ias/toplink/ TopLink Wiki: http://wiki.eclipse.org/EclipseLink EclipseLink , http://wiki.oracle.com/page/TopLink TopLink Forums: http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , http://www.nabble.com/EclipseLink-f26430.html EclipseLink Book: http://en.wikibooks.org/wiki/Java_Persistence Java Persistence -- View this message in context: http://www.nabble.com/Wrong-cast-for-%40Converted-column-in-where-clause-tp24091920p24094984.html Sent from the EclipseLink - Users mailing list archive at Nabble.com. _______________________________________________ eclipselink-users mailing list eclipselink-users@... https://dev.eclipse.org/mailman/listinfo/eclipselink-users _______________________________________________ eclipselink-users mailing list eclipselink-users@... https://dev.eclipse.org/mailman/listinfo/eclipselink-users |
| Free embeddable forum powered by Nabble | Forum Help |