我正在将jpa提供程序从Eclipselink 2.4.2迁移到Hibernate 4.3.5。
我想传递一个对象列表作为IN运算符的参数。目前,我正在尝试使用List<UUID>
,但它也失败了List<Class<?>>
。
我的查询如下:
SELECT e
FROM Entity e
WHERE e.uuid IN :uuids;
代码:
List<UUID> uuids = new ArrayList<UUID>();
uuids.add(UUID.fromString("..."));
Query query = session.createQuery(queryString);
query.setParameter("uuids", uuids);
List list = query.list(); // <-- fails here
List<UUID>
的例外:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.UUID
使用UUID[]
:
java.lang.ClassCastException: [Ljava.util.UUID; cannot be cast to java.util.UUID
Hibernate似乎没有正确理解这种列表。调试时,我可以看到QueryLoader
使用了正确的描述符,但没有将其翻译为列表。
实际上,这与Eclipselink合作。我做错了什么?
答案 0 :(得分:2)
我猜您正在使用query.setParameter(..)
(而不是代码示例中所述的session.setParaemter(..)
。
对于命名查询的多个值,您应该使用setParameterList
而不是setParameter
:
List<UUID> uuids = new ArrayList<UUID>();
uuids.add(UUID.fromString("..."));
Query query = session.createQuery(queryString);
// **This method setParameterList bind multiple values to a named query parameter.**
query.setParameterList("uuids", uuids);
List list = query.list();