Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] Wrong cast for @Converted column in where-clause


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

Back to the top