【问题标题】:Eclipselink in clauseEclipselink in 子句
【发布时间】:2018-02-26 14:36:50
【问题描述】:

我正在尝试在 eclipselink JPA 中使用 in 子句,但没有任何效果

final String parameterizedQuery = "Select * FROM sap.Preco WHERE cliente_id = ?clienteId and numero_material in ( ?numeroMaterial )";
listPreco = em.createNativeQuery(parameterizedQuery)
                .setParameter("clienteId", clienteId).setParameter("numeroMaterial", produtoId)
                .getResultList();

produtoId id 是一个以逗号分隔的字符串

String produtoId = StringUtils.join(listMaterial, "','");

String produtoId = StringUtils.join(listMaterial, ",");

两者都不起作用,这是日志:

选择 * FROM sap.Preco WHERE cliente_id = ?和 (?) 中的 numero_material 绑定 => [0000006775, 000000000000100003,000000000000100003]

已经尝试使用列表作为参数但不起作用。

内部异常:org.postgresql.util.PSQLException:无法推断要用于 java.util.ArrayList 实例的 SQL 类型。使用带有特定值类型的 setObject() 来指定要使用的类型。

【问题讨论】:

  • 为什么使用原生 SQL 查询而不是 JPQL?这在 JPQL 中得到支持,它将分解列表并将每个项目添加到生成的 SQL 中,但对于原生 SQL 查询,您必须自己单独添加每个项目。或者将其添加到 SQL 语句内联,但这会使您面临 SQL 注入攻击。

标签: java sql jpa eclipselink


【解决方案1】:

不能使用逗号分隔的字符串,而且 JDBC 不支持带参数的 IN

详细了解您拥有的选项: https://javachannel.org/posts/using-sqls-in-in-jdbc/

【讨论】:

  • postgres 不支持列表。
  • 但是您使用的是 JPA。这会照顾它。所以 setParameter 在幕后做了一些魔术
  • 内部异常:org.postgresql.util.PSQLException:无法推断要用于 java.util.ArrayList 实例的 SQL 类型。使用带有特定值类型的 setObject() 来指定要使用的类型。
  • 区别是 JPQL 支持这个,SQL 不支持。
【解决方案2】:

尝试删除命名参数周围的括号:

final String parameterizedQuery = "Select * FROM sap.Preco WHERE cliente_id = ?clienteId and numero_material in  ?numeroMaterial ";

并将字符串列表作为参数传递:

em.setParameter("numeroMaterial", listMaterial);

【讨论】:

  • 内部异常:org.postgresql.util.PSQLException:无法推断要用于 java.util.ArrayList 实例的 SQL 类型。使用带有特定值类型的 setObject() 来指定要使用的类型。
猜你喜欢
  • 2013-09-06
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多