[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] Wrong cast for @Converted column in where-clause
|
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.