Skip to main content

[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.



Back to the top