将空集设置为SQL IN参数时出现SQLGrammarException

时间:2015-05-07 18:23:14

标签: java sql hibernate jpa

当我将空集设置为SQL IN参数时,我的代码会导致SQLGrammarException

Query query = this.entMngr.createNativeQuery("SELECT foo_id, first, last FROM foo WHERE bar IN :barSet");
//barSet is a Set<Integer>
query.setParameter("barSet", barSet);
//this throws exception
List<Object> nativeList =  query.getResultList();

当集合不为空时,一切都有效。我怎样才能知道集合(或任何集合提交)是否已填充?

2 个答案:

答案 0 :(得分:3)

这里的问题是SQL语法不允许空IN子句。因此,在您的情况下,barSet不应为空。但是您可以在将null传递给查询之前简单地添加barSet.add(null); query.setParameter("barSet", barSet);

fwrite()

你可以在这里阅读这个技巧:SQL In Clause with Zero to Many Parameters

答案 1 :(得分:0)

hibernate中的In子句与Query.setParameterList() https://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Query.html#setParameterList(java.lang.String,java.util.Collection)方法一起使用。

您需要使用此方法并将Collection或Array作为参数传递。

Query query = this.entMngr.createNativeQuery("SELECT foo_id, first, last FROM foo WHERE bar IN :barSet");
//barSet is a Set<Integer>
query.setParameterList("barSet", barSet); // as barSet is a Collection.
//this throws exception
List<Object> nativeList =  query.getResultList();