2013-02-15 11 views
7

Próbowałem tej kwerendy HQL, ale zgłasza UnsupportedOperationException kiedy używam actProp [key] =:: wartość w następującym zapytaniem:HQL: odpytywanie wartości java.util.Map

Zaznacz wszystkie działania które zawierają wartości par x, y lub z, y w actionProperties mAP:

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) "); 

wyjątek:

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

w działaniu jednostki:

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

Próbowałem również użyć do tego Kryteriów Hibernacji, ale nie sądzę, aby było to możliwe.

Czy ktoś wie coś do zastąpienia: actProp [: key] =: value z działającym kodem?

Odpowiedz

8

Po kilku próbach i błędach w końcu znalazłem rozwiązanie, które nie jest tak proste.

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)))" 
     ); 

Tak, dla dopasowania na kluczu użyłem funkcji index() i dopasowywania na wartości użyłem funkcji elements().

Jeśli znasz lepsze rozwiązanie, daj mi znać.

+1

Mam ten sam problem i wydaje mi się, że to nie gwarantuje, że klucz i wartość są ze sobą powiązane. To tylko gwarantuje, że istnieje taki klucz i taka wartość we właściwościach, ale wartość może być powiązana z innym kluczem, który nie działa dla mnie. –

Powiązane problemy