【问题标题】:HQL: querying value of java.util.MapHQL:查询 java.util.Map 的值
【发布时间】:2013-01-31 12:53:28
【问题描述】:

我尝试了这个 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)

在实体Action中:

@CollectionOfElements(fetch = FetchType.EAGER)
private Map<String, String> actionProperties;

我也尝试为此使用 Hibernate Criteria,但我认为这是不可能的。

有人知道用工作代码替换:actProp[:key] = :value 吗?

【问题讨论】:

    标签: java hibernate jpa map hql


    【解决方案1】:

    经过反复试验,我终于找到了解决方案,但并不是那么简单。

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

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

    【讨论】:

    • 我遇到了同样的问题,在我看来这并不能保证键和值实际上是关联在一起的。它只是保证属性中有一个这样的键和这样的值,但该值可能与对我不起作用的不同键相关联。
    猜你喜欢
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多