FAQ
EJBQL collection binding
------------------------

Key: CAY-1121
URL: https://issues.apache.org/cayenne/browse/CAY-1121
Project: Cayenne
Issue Type: Bug
Components: Cayenne Core Library
Affects Versions: 3.0
Reporter: Andrus Adamchik
Assignee: Andrus Adamchik
Fix For: 3.0


When binding collections as EJBQL variable, Cayenne erroneously binds each collection value as VARBINARY at the JDBC level. This works ok on some DB's (hiding the problem) but breaks on some others. E.g. on SQLServer:

List<Integer> id = ...

String ejbql = "delete from MeaningfulPKTest1 m WHERE m.pkAttribute in (:id)";

EJBQLQuery query = new EJBQLQuery(ejbql);
query.setParameter("id", id);

Results in the following error:

INFO: *** error.
com.microsoft.sqlserver.jdbc.SQLServerException: The conversion from INTEGER to VARBINARY is unsupported.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:130)
at com.microsoft.sqlserver.jdbc.DataTypes.throwConversionError(DataTypes.java:879)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:913)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:884)
at org.apache.cayenne.access.types.AbstractType.setJdbcObject(AbstractType.java:79)
at org.apache.cayenne.dba.JdbcAdapter.bindParameter(JdbcAdapter.java:497)
at org.apache.cayenne.dba.sybase.SybaseAdapter.bindParameter(SybaseAdapter.java:99)
at org.apache.cayenne.access.jdbc.SQLTemplateAction.bind(SQLTemplateAction.java:325)
at org.apache.cayenne.access.jdbc.SQLTemplateAction.execute(SQLTemplateAction.java:150)
at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:127)
at org.apache.cayenne.access.jdbc.EJBQLAction.performAction(EJBQLAction.java:101)
at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:58)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:237)
at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:424)
at org.apache.cayenne.access.DataDomainQueryAction.access$0(DataDomainQueryAction.java:403)
at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:397)
at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:847)
at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:394)
at org.apache.cayenne.access.UnitTestDomainQueryAction.runQueryInTransaction(UnitTestDomainQueryAction.java:55)
at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:120)
at org.apache.cayenne.access.UnitTestDomainQueryAction.execute(UnitTestDomainQueryAction.java:49)
at org.apache.cayenne.access.UnitTestDomain.onQuery(UnitTestDomain.java:63)
at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:317)
at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:96)
at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1326)
at org.apache.cayenne.access.DataContext.performGenericQuery(DataContext.java:1285)
at org.apache.cayenne.access.DataContextEJBQLDeleteTest.testDeleteIdVar(DataContextEJBQLDeleteTest.java:98)


The problem is SQLTemplate #bind directive incomplete collection handling.

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Search Discussions

  • Anonymous at Oct 11, 2008 at 8:09 pm
    [ https://issues.apache.org/cayenne/browse/CAY-1121?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

    Andrus Adamchik closed CAY-1121.
    --------------------------------

    Resolution: Fixed
    EJBQL collection binding
    ------------------------

    Key: CAY-1121
    URL: https://issues.apache.org/cayenne/browse/CAY-1121
    Project: Cayenne
    Issue Type: Bug
    Components: Cayenne Core Library
    Affects Versions: 3.0
    Reporter: Andrus Adamchik
    Assignee: Andrus Adamchik
    Fix For: 3.0


    When binding collections as EJBQL variable, Cayenne erroneously binds each collection value as VARBINARY at the JDBC level. This works ok on some DB's (hiding the problem) but breaks on some others. E.g. on SQLServer:
    List<Integer> id = ...

    String ejbql = "delete from MeaningfulPKTest1 m WHERE m.pkAttribute in (:id)";

    EJBQLQuery query = new EJBQLQuery(ejbql);
    query.setParameter("id", id);
    Results in the following error:
    INFO: *** error.
    com.microsoft.sqlserver.jdbc.SQLServerException: The conversion from INTEGER to VARBINARY is unsupported.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:130)
    at com.microsoft.sqlserver.jdbc.DataTypes.throwConversionError(DataTypes.java:879)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:913)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:884)
    at org.apache.cayenne.access.types.AbstractType.setJdbcObject(AbstractType.java:79)
    at org.apache.cayenne.dba.JdbcAdapter.bindParameter(JdbcAdapter.java:497)
    at org.apache.cayenne.dba.sybase.SybaseAdapter.bindParameter(SybaseAdapter.java:99)
    at org.apache.cayenne.access.jdbc.SQLTemplateAction.bind(SQLTemplateAction.java:325)
    at org.apache.cayenne.access.jdbc.SQLTemplateAction.execute(SQLTemplateAction.java:150)
    at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:127)
    at org.apache.cayenne.access.jdbc.EJBQLAction.performAction(EJBQLAction.java:101)
    at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:58)
    at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:237)
    at org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:424)
    at org.apache.cayenne.access.DataDomainQueryAction.access$0(DataDomainQueryAction.java:403)
    at org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:397)
    at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:847)
    at org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:394)
    at org.apache.cayenne.access.UnitTestDomainQueryAction.runQueryInTransaction(UnitTestDomainQueryAction.java:55)
    at org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:120)
    at org.apache.cayenne.access.UnitTestDomainQueryAction.execute(UnitTestDomainQueryAction.java:49)
    at org.apache.cayenne.access.UnitTestDomain.onQuery(UnitTestDomain.java:63)
    at org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:317)
    at org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:96)
    at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1326)
    at org.apache.cayenne.access.DataContext.performGenericQuery(DataContext.java:1285)
    at org.apache.cayenne.access.DataContextEJBQLDeleteTest.testDeleteIdVar(DataContextEJBQLDeleteTest.java:98)
    The problem is SQLTemplate #bind directive incomplete collection handling.
    --
    This message is automatically generated by JIRA.
    -
    You can reply to this email to add a comment to the issue online.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupdev @
categoriescayenne
postedOct 11, '08 at 6:07p
activeOct 11, '08 at 8:09p
posts2
users1
websitecayenne.apache.org

1 user in discussion

Anonymous: 2 posts

People

Translate

site design / logo © 2021 Grokbase