Java OpenJPA查询第二次失败(可能是因为字节数组参数)

Java OpenJPA查询第二次失败(可能是因为字节数组参数),java,db2,websphere,openjpa,Java,Db2,Websphere,Openjpa,我有以下OpenJPA查询(通过db2数据库): 列uuid定义为位数据(16)的VARCHAR。在实体中,它表示为byte[]类型字段 问题是,当我第一次使用该查询调用该方法时(在WebSphere server启动之后),它工作正常。间接调用导致错误(我甚至启用了跟踪日志,请查看错误所在) 这是属于例外情况的代码: Caused by: java.lang.NullPointerException at org.apache.openjpa.jdbc.sql.DB2Dictionary.se

我有以下OpenJPA查询(通过db2数据库):

列uuid定义为位数据(16)的VARCHAR。在实体中,它表示为byte[]类型字段

问题是,当我第一次使用该查询调用该方法时(在WebSphere server启动之后),它工作正常。间接调用导致错误(我甚至启用了跟踪日志,请查看错误所在)

这是属于例外情况的代码:

Caused by: java.lang.NullPointerException
at org.apache.openjpa.jdbc.sql.DB2Dictionary.setBytes(DB2Dictionary.java:1037)
at org.apache.openjpa.jdbc.sql.DBDictionary.setUnknown(DBDictionary.java:1481)
at org.apache.openjpa.jdbc.sql.DBDictionary.setUnknown(DBDictionary.java:1429)
at org.apache.openjpa.jdbc.kernel.PreparedSQLStoreQuery$PreparedSQLExecutor.executeQuery(PreparedSQLStoreQuery.java:114)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863)
... 86 more 
public String findByUUID(UUID uuid) {

    TypedQuery<Number> query = em.createQuery("Select n from Number n where n.uuid = :uuid", Number.class);
    ByteBuffer bb = ByteBuffer.allocate(16);
    bb.putLong(uuid.getMostSignificantBits());
    bb.putLong(uuid.getLeastSignificantBits());
    byte[] parameter = bb.array();

    query.setParameter("uuid", parameter);

    List<Number> result = new ArrayList<Number>(query.getResultList());
    return result;
}

我通过查看的源代码了解到了这一点,但同时这对我没有帮助。

尝试禁用准备好的查询缓存。这是众所周知的相当多的童车。如果需要,您可以搜索OpenJPA JIRA以查找详细信息


您好,您是否尝试过最新的OpenJPA。提供的stacktrace包含
openjpa-2.1.2-SNAPSHOT-r422266:1548248
。另外,了解您的db2和hibernate版本也很好。我假设db2是v9.7FP7。(基于stacktrace信息)
query.setHint(“openjpa.hint.InvalidatePreparedQuery”,“true”)仅对一个查询执行相同的操作。
Caused by: java.lang.NullPointerException
at org.apache.openjpa.jdbc.sql.DB2Dictionary.setBytes(DB2Dictionary.java:1037)
at org.apache.openjpa.jdbc.sql.DBDictionary.setUnknown(DBDictionary.java:1481)
at org.apache.openjpa.jdbc.sql.DBDictionary.setUnknown(DBDictionary.java:1429)
at org.apache.openjpa.jdbc.kernel.PreparedSQLStoreQuery$PreparedSQLExecutor.executeQuery(PreparedSQLStoreQuery.java:114)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1005)
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863)
... 86 more 
public String findByUUID(UUID uuid) {

    TypedQuery<Number> query = em.createQuery("Select n from Number n where n.uuid = :uuid", Number.class);
    ByteBuffer bb = ByteBuffer.allocate(16);
    bb.putLong(uuid.getMostSignificantBits());
    bb.putLong(uuid.getLeastSignificantBits());
    byte[] parameter = bb.array();

    query.setParameter("uuid", parameter);

    List<Number> result = new ArrayList<Number>(query.getResultList());
    return result;
}
nested exception is: javax.ejb.EJBException: See nested exception; nested exception is: org.apache.openjpa.persistence.PersistenceException: The value of input variable, expression or parameter number "1" cannot be used because of its data type.. SQLCODE=-301, SQLSTATE=07006, DRIVER=4.14.113 {prepstmnt 2039708348 SELECT t0.NUMBER_ID, t0.comment, t0.EMPLOYEE_ID, t0.number, t0.RANGE_ID, t0.status, t0.uuid FROM PHONES.Number t0 WHERE (t0.uuid = ?) [params=?]} [code=-301, state=07006]SQLCA OUTPUT[Errp=SQLRI4A4, Errd=-2145779603, 0, 0, 0, -3700, 0] The value of input variable, expression or parameter number "1" cannot be used because of its data type.. SQLCODE=-301, SQLSTATE=07006, DRIVER=4.14.113 FailedObject: Select n from Number n where n.uuid = :uuid [java.lang.String]