HQL意外的AST节点:使用ArrayList作为参数时的{vector}

时间:2017-10-27 15:26:40

标签: java hibernate jpa

搜索并发现了很多关于此的问题,但对于我的具体情况没有任何问题。我的HQL查询出错,这是代码:

String year = "";
ArrayList<String> loc = new ArrayList<>();

// Set above variables to something here
//
query = em.createQuery("select distinct x.fmlName, " +
        "                               x.email " +
        "                   from person x " +
        "                  where x.year = :selYear " +
        "                    and ((:selLoc = 'ALL') " +
        "                        or x.loc IN (:selLoc)) ");

query.setParameter("selYear", year);
query.setParameter("selLoc", loc);

return query.getResultList();

这是错误:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is 
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: {vector}

我对Hibernate相对较新,并且我正在努力解决这个问题,因为错误消息并不是非常有用。有任何想法吗?

2 个答案:

答案 0 :(得分:0)

你有问题:

"                    and ((:selLoc = 'ALL') "
//----------------------------^

这应该是字段的名称,或者字符串,所以:

  • 如果:selLoc应该是字段的名称,这是不可能的,要像这样使用它,因为当您使用setPrameter("field", "fieldname")时,您的查询应该看起来像'fieldname' = 'ALL'这样不正确,因为字段不应该在2个引号之间
  • 但似乎您正在使用列表并将其与字符串进行比较,这也不正确

答案 1 :(得分:0)

  1. (:selLoc)更改为:selLoc。在HQL中使用Java List时,如下所示:
  2. ... WHERE x.loc IN :myList

    myList不得括在括号中。

    1. 此外,这是错误的(:selLoc = 'ALL')