HQL: 查询 java.util.Map 的值

7
我尝试了这个HQL查询,但是当我在以下查询中使用 actProp[:key] = :value时,它会抛出UnsupportedOperationException异常:
选择包含映射动作属性中值对x,y或z,y的所有操作:
Query query = getSession().createQuery(
    "select a from Action a                     " +
    " join a.actionProperties actProp           " +
    "   where (index(actProp) = :key            " +
    "           and actProp[:key] = :value )    " +
    "     or  (index(actProp) = :key2           " +
    "           and actProp[:key2] = :value )   ");

异常情况:

java.lang.UnsupportedOperationException
        at org.hibernate.hql.ast.tree.IdentNode.resolveIndex(IdentNode.java:67)

在实体操作中:
@CollectionOfElements(fetch = FetchType.EAGER)
private Map<String, String> actionProperties;

我尝试使用Hibernate Criteria实现这个功能,但我认为这是不可能的。 有人知道用可行代码替换actProp [:key] =:value吗?
1个回答

8

经过一些尝试和错误,我终于找到了解决方案,但并不是很简单。

Query query = getSession().createQuery(
        " from Action a " +
        " join a.actionProperties actProp                      " +
        "   where( (index(actProp) = :key                      " +
        "           and :value in elements(a.actionProperties))" +
        "       or (index(actProp) = :key2                     " +
        "           and :value in elements(a.actionProperties)) )"
        );

因此,我使用index()函数来匹配键,使用elements()函数来匹配值。

如果您知道更好的解决方案,请告诉我。


2
我遇到了同样的问题,对我来说似乎这并不保证键和值实际上是关联在一起的。它只保证在属性中有这样的键和这样的值,但该值可能与不同的键相关联,这对我来说行不通。 - Thang Mai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接