Wrong cast for @Converted column in where-clause

View: New views
3 Messages — Rating Filter:   Alert me  

Wrong cast for @Converted column in where-clause

by Bob Sloots :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


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
_______________________________________________
eclipselink-users mailing list
eclipselink-users@...
https://dev.eclipse.org/mailman/listinfo/eclipselink-users

Re: Wrong cast for @Converted column in where-clause

by James Sutherland :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

Re: Wrong cast for @Converted column in where-clause

by Bob Sloots :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Hi 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



James Sutherland <jamesssss@...>

18-06-2009 17:08
Please respond to
EclipseLink User Discussions <eclipselink-users@...>

To
eclipselink-users@...
cc
Subject
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.

_______________________________________________
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