2011-05-10 15 views
0

JPA 1与单元测试支持的Hsqldb 1.8中的OpenJPA 1.2.2。以下JPA QL无法在ID列表中使用“IN”不起作用。JPA QL“IN”收集不适用于openjpa 1.2.2

@Transactional 
public void updateSettlementId(List<Long> voucherIds, Long settlementId) { 
    String query = "UPDATE VoucherProcessed vp SET vp.settlement.id=:settlementId where vp.voucher.id IN (:voucherIds)"; 
    em.createQuery(query).setParameter("settlementId", settlementId) 
      .setParameter("voucherIds", StringUtils.join(voucherIds.iterator(), ",")) 
      .executeUpdate(); 
} 

值java.sql.SQLException:表在声明中没有找到[更新VOUCHER_PROCESSED T0设置t1.settlement_id =? WHERE(t0.voucher_id IN(?))]

VOUCHER_PROCESSED表正在hsqldb中创建,同时测试运行,因此上述错误似乎是错误的和误导性的。

建议?

+1

任何人都可以指出代码格式化程序应该在这里工作吗? – pritam 2011-05-10 16:13:09

+0

我更正了格式,请查看[formatting help](http://stackoverflow.com/editing-help)。 – 2011-05-10 16:16:33

+0

尝试Databasename.TABLENAME也不需要使用StringUtils,查询[1] setParameterList需要一个集合,上次我检查 – Narayan 2011-05-10 16:33:13

回答

1

试试这个:

.setParameter("voucherIds", voucherIds) 

作品与休眠模式,但(请纠正我,如果我错了)JPA规范没有 定义 IN构建 允许使用收集setParameter()对于喜欢“IN (:voucherIds)”查询,它是供应商特定的。

+0

我知道它与hibernate一起工作,但它不在openjpa中。 – pritam 2011-05-12 13:22:12

+0

@priya我实际上可以确认提出的解决方案在OpenJPA 1.2.2中可用,您只需直接提供Longs列表。 – MaDa 2011-08-30 12:44:57

+0

@TomaszNurkiewicz它的确如此。第4.6.8节“JSR 220:EJB版本3.0,Java持久性API”(JPA 1.0)中的“IN表达式”。 – MaDa 2011-09-06 22:14:48

相关问题