7

このhqlクエリを試しましたが、次のクエリでactProp [:key] =:valueを使用すると、UnsupportedOperationExceptionがスローされます。

マップactionPropertiesで値のペア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;

これにもHibernateCriteriaを使用しようとしましたが、これは不可能だと思います。

誰かが: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 に答える