We found out some more details about this one.

OpenJPA causes a PersistenceException: ORA-00936: missing expression when a
named query is executed for "ExportOrder". The sql statement contains empty
IN() expressions in the where clause. "ExportOrder" has a one-to-many
relation to "ExportOrderVm" (fetch type "EAGER"). The entity "ExportOrderVm"
has a composite primary key that is represented by the id class
"ExportOrderVmId".

In 4 different scenarios everything works perfectly:
- if the fetch type is changed to "LAZY"
- if execution is performed as native query
- if "ExportOrderVm" wouldn’t have a composite primary key
- if using H2 database instead of Oracle

Why does the named query fail in the constellation described above
(FetchType.EAGER, Oracle, Composite Primary Key, NamedQuery)?

We think this is a bug in how OpenJPA generates SELECT statements. Could you
please have a look? Thank you!

This doesn’t work:
Query query = em.createNamedQuery("selectAllExportOrder");
List<ExportOrder> exportOrderList = query.getResultList();

This works fine:
Query query = em.createNativeQuery("SELECT * FROM EXPORT_ORDER",
ExportOrder.class);
List<ExportOrder> exportOrderList = query.getResultList();


public class ExportOrderVmId implements Serializable {
    private Long exportOrderId;
    private Long vmId;
    :
}


@Entity
@IdClass(ExportOrderVmId.class)
@Table(name = "EXPORT_ORDER_VM", schema = "INFOP_SYSTEM")
public class ExportOrderVm implements Serializable {

    @Id
    @Column(name = "VM_ID")
    private Long vmId;

    @Id
    @ManyToOne
    @JoinColumn(name = "EXPORT_ORDER_ID")
    @ForeignKey
    private ExportOrder exportOrderId;
    :
}

@Entity
@NamedQuery(name = "selectAllExportOrder", query = "SELECT ea FROM
ExportOrder ea")
@Table(name = "EXPORT_ORDER", schema = "INFOP_SYSTEM")
public class ExportOrder implements Serializable {

    @Id
    @SequenceGenerator(name = "InfopSystem.seqExportOrder", sequenceName =
"INFOP_SYSTEM.SEQ_EXPORT_ORDER")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator =
"InfopSystem.seqExportOrder")
    @Column(name = ID)
    private Long id;

    @Size(max = 100)
    @Column(name = NAME)
    private String name;

    @ElementDependent
    @OneToMany(mappedBy = "exportOrderId", fetch = FetchType.EAGER, cascade
= CascadeType.ALL)
    private List<ExportOrderVm> exportOrderVmList = new
ArrayList<ExportOrderVm>();
    :
}


<openjpa-1.2.3-SNAPSHOT-r422266:1053401 nonfatal general error>
org.apache.openjpa.persistence.PersistenceException: ORA-00936: missing
expression
{prepstmnt 328799129 
SELECT t0.ID, t1.EXPORT_ORDER_ID, t1.VM_ID, t2.ID, t2.NAME
    FROM INFOP_SYSTEM.EXPORT_ORDER t0, 
        INFOP_SYSTEM.EXPORT_ORDER_VM t1, 
        INFOP_SYSTEM.EXPORT_ORDER t2 
    WHERE (t0.ID IN (?, ?) OR t0.ID IN () OR t0.ID IN () OR 
        t0.ID IN () OR t0.ID IN ()) AND t0.ID = 
        t1.EXPORT_ORDER_ID AND t1.EXPORT_ORDER_ID = 
        t2.ID(+) 
    ORDER BY t0.ID ASC 
[params=(long) 780, (long) 778]} [code=936, state=42000]
            at
org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4247)
            at
org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4212)
            at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:102)
            at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:88)
            at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:64)
            at
org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.handleCheckedException(SelectResultObjectProvider.java:155)
            at
org.apache.openjpa.lib.rop.WindowResultList.getInternal(WindowResultList.java:150)
            at
org.apache.openjpa.lib.rop.AbstractNonSequentialResultList.get(AbstractNonSequentialResultList.java:73)
            at
org.apache.openjpa.kernel.DelegatingResultList.get(DelegatingResultList.java:244)
            :
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ORA-00936:
missing expression
{prepstmnt 328799129 
SELECT t0.ID, t1.EXPORT_ORDER_ID, t1.VM_ID, t2.ID, t2.NAME
    FROM INFOP_SYSTEM.EXPORT_ORDER t0, 
        INFOP_SYSTEM.EXPORT_ORDER_VM t1, 
        INFOP_SYSTEM.EXPORT_ORDER t2 
    WHERE (t0.ID IN (?, ?) OR t0.ID IN () OR t0.ID IN () OR 
        t0.ID IN () OR t0.ID IN ()) AND t0.ID = 
        t1.EXPORT_ORDER_ID AND t1.EXPORT_ORDER_ID = 
        t2.ID(+) 
    ORDER BY t0.ID ASC 
[params=(long) 780, (long) 778]} [code=936, state=42000]
            at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:215)
            at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:203)
            at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:57)
            at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:895)
            at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:262)
            at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeQuery(JDBCStoreManager.java:1599)
            at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:252)
            at
org.apache.openjpa.jdbc.sql.SelectImpl.executeQuery(SelectImpl.java:509)
            at
org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:384)
            at
org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:325)
            at
org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:331)
            at
org.apache.openjpa.jdbc.kernel.PagingResultObjectProvider.executeEagerSelects(PagingResultObjectProvider.java:380)
            at
org.apache.openjpa.jdbc.kernel.PagingResultObjectProvider.executeEagerSelects(PagingResultObjectProvider.java:299)
            at
org.apache.openjpa.jdbc.kernel.PagingResultObjectProvider.fillPage(PagingResultObjectProvider.java:270)
            at
org.apache.openjpa.jdbc.kernel.PagingResultObjectProvider.getResultObject(PagingResultObjectProvider.java:219)
            at
org.apache.openjpa.lib.rop.WindowResultList.getInternal(WindowResultList.java:131)
            ... 29 more
NestedThrowables:
java.sql.SQLSyntaxErrorException: ORA-00936: missing expression
            at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
            at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
            at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
            at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
            at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
            at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
            at
oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
            at
oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:863)
            at
oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1153)
            at
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1275)
            at
oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
            at
oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3620)
            at
oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
            at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:264)
            at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:893)
            at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:262)
            at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeQuery(JDBCStoreManager.java:1599)
            at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:252)
            at
org.apache.openjpa.jdbc.sql.SelectImpl.executeQuery(SelectImpl.java:509)
            at
org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:384)
            at
org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:325)
            at
org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:331)
            at
org.apache.openjpa.jdbc.kernel.PagingResultObjectProvider.executeEagerSelects(PagingResultObjectProvider.java:380)
            at
org.apache.openjpa.jdbc.kernel.PagingResultObjectProvider.executeEagerSelects(PagingResultObjectProvider.java:299)
            at
org.apache.openjpa.jdbc.kernel.PagingResultObjectProvider.fillPage(PagingResultObjectProvider.java:270)
            at
org.apache.openjpa.jdbc.kernel.PagingResultObjectProvider.getResultObject(PagingResultObjectProvider.java:219)
            at
org.apache.openjpa.lib.rop.WindowResultList.getInternal(WindowResultList.java:131)
            at
org.apache.openjpa.lib.rop.AbstractNonSequentialResultList.get(AbstractNonSequentialResultList.java:73)
            at
org.apache.openjpa.kernel.DelegatingResultList.get(DelegatingResultList.java:244)
            :


--
View this message in context: 
http://openjpa.208410.n2.nabble.com/Wrong-SQL-statement-being-generated-tp7470306p7484773.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to