7

我尝试了这个 hql 查询,但是当我在以下查询中使用actProp[:key] = :value时,它​​会引发 UnsupportedOperationException:

选择地图 act​​ionProperties 中包含值对 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吗?

4

1 回答 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()函数。

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

于 2013-02-15T15:45:02.140 回答