Java HQL在何处用于空列表崩溃

Java HQL在何处用于空列表崩溃,java,grails,groovy,hql,Java,Grails,Groovy,Hql,我有这样一个HQL语句: Select cast(ed.employee.employeeID as int) AS emp_id FROM Education AS ed WHERE ed.type.name IN (:typeNames) 然而,有时候,typeNames是空的。这导致以下情况: org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree [Select cast(ed.employee.emp

我有这样一个HQL语句:

Select cast(ed.employee.employeeID as int) AS emp_id FROM Education AS ed WHERE ed.type.name IN (:typeNames)
然而,有时候,typeNames是空的。这导致以下情况:

org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree [Select cast(ed.employee.employeeID as int) AS emp_id FROM Education AS ed WHERE ed.type.name IN ()]

让它接受一个空列表的解决方案是什么?

我使用的一个解决方案是,在列表中放置一些虚拟值以及您的输入,以确保它永远不会为空。当然,只有在可以选择虚拟值的情况下才能执行此操作

如果您的输入列表是
typeNamesOrig

List<String> typeNames = new ArrayList<String>(typeNamesOrig);
typeNames.add("valueThatDoesNotExistForSure");
query.setParameterList("typeNames",typeNames);
List typeNames=new ArrayList(typeNamesOrig);
typeNames.add(“不适用于文本的值”);
query.setParameterList(“typeNames”,typeNames);

如果typeNames为空/null,我可能不会执行查询:

if (typeNames) result = Foo.executeQuery("select ... where e.type.name in :typeNames", [typeNames: typeNames)

虚拟值绝对是最简单的解决方案,除非您永远无法确定该值是否存在。最好的方法是添加另一个变量以指示列表为空

if(typeNames.isEmpty()) typeNames = null

// Call Query

选择*
从书本上
其中,(:id)中的id和:listHasItems=1

如果列表中没有项目,只需向其添加一个随机id,并将listHasItems设置为0。

如果数组为空,则可以将:typeNames list设置为null

if(typeNames.isEmpty()) typeNames = null

// Call Query


如果列表为空-get all或get none,该行为应该是什么?如果列表为空,则不应返回任何结果。在将列表作为参数传递给HQL查询之前,您不能检查列表吗?我相信HQL只是反映了SQL的行为,如果您尝试执行IN()查询,它也会抛出一个错误?@Derek,我同意Ted的说法。如果您在这种情况下寻找一个空列表,为什么要执行查询:-)Hibernate jira中有一个(当前)打开的bug about empty in()问题:您能解释一下为什么不能吗?由于任何类型名称都不会包含在空列表中,因此我希望不会选择任何内容。因此,结果集是空的。这主要是因为它省去了到数据库的往返过程,以确定我们可以在代码中知道的东西,还因为它解决了hibernate中的问题,该问题迫使接受的答案之类的东西在列表中放入一个伪值。@Ted有时您无法避免执行。我面临同样的问题,查询中有一个OR in WHERE子句。所有其他绑定参数都具有有效值,即使列表为空,查询也会返回结果。在我的场景中使用虚拟值是很危险的,所以没有出路。是否有其他解决方案?即使集合为空,仍有一些查询需要执行。有效的注意事项是使用可选的
excludeId
集合从更新中排除特定行。这在使用枚举集合时不起作用。因为您只能使用枚举值,而不仅仅是一些不存在的字符串,所以每个枚举值返回一个或多个结果的可能性很大。为这个目的而创建一个额外的空枚举值将是多余的,而且非常丑陋。这种解决方案解决了一个问题,同时引入了一个新的问题,我强烈建议考虑其他的答案。“帕维尔,这里没有其他合法的答案,尽管……(我认为这仍然会导致SQL无效