Как использовать ключ MAP в Criteria Query? - PullRequest
8 голосов
/ 14 февраля 2011

У меня есть такой Боб

Class TestA
{
    Map<String,TestB> testBMap;
}

Class TestB
{
    String data;
    ...
}

Я хочу получить данные TestA вместе с картой testBMap, где key ='test1'.

Как мне это сделать?используя Hibernate.

Ответы [ 4 ]

4 голосов
/ 14 февраля 2011

Ключ должен быть значением одного из постоянных полей TestB (допустим, это поле называется «foo»), поэтому этот код должен работать:

Criteria criteria = session.createCriteria(TestA.class, "a");
criteria.createAlias("a.testBMap", "b");
criteria.add(Restrictions.eq("b.foo", "test1"));
criteria.setFetchMode("a.testBMap", FetchMode.JOIN);
return criteria.list();
3 голосов
/ 10 декабря 2013

В моем случае это работало нормально:

countries = getSession().createCriteria( Country.class ).add( Restrictions.in( "region", regions ) )
                .createAlias( "name.translations", "translation" )
                .add( Restrictions.eq( "translation.indices", 'en' )).list();

Отображение выглядит так: Страна имеет имя свойства типа LocalizedText (сущность) LocalizedText содержит Map<String, String> переводов, где ключ - это код языка, а значение - название страны, соответствующее этому языку. Поэтому мне пришлось создать псевдоним для переводов, а затем пользовательский "волшебный" постфикс ".indices" в eq().

2 голосов
/ 03 июня 2011

Пока Hibernate не реализует функцию JPA key() (см. HHH-5396 ), вы можете использовать функцию index():

session
    .createQuery("select a from TestA a join a.testBMap m where index(m) = :key")
    .setParameter("key", "test1")
    .list();
1 голос
/ 07 мая 2014

Это работает для меня:

Criteria criteria = session.createCriteria(TestA.class);
criteria.createAlias("testBMap", "t");
criteria.add(Restrictions.eq("t." + CollectionPropertyNames.COLLECTION_INDEX, "test1"));
return criteria.list();
...