Hibernate: Критерии findByExample с использованием ассоциаций - PullRequest
3 голосов
/ 10 февраля 2012

Я работаю над моделью предметной области, использующей Hibernate для нового проекта.У меня есть объект, который в основном состоит из longName:String, shortName:String и otherNames:Collection<String>.

. Я смог настроить это нормально, но теперь я хочу поработать над некоторыми функциями DAO, которыепозволит пользователю найти сущность по примеру, т.е. я смогу создать объект сущности и установить некоторые поля, а затем, когда я передам это в поиск, он должен вернуть список результатов, которые соответствуют полям, которые былизадавать.Я знаю, что могу сделать это, используя Hibernate Example s.

public List<Entity> findByExample(EntityexampleObject) {
    try {
        Criteria criteria = getSession().createCriteria(type);
        Example example = Example.create(exampleObject).ignoreCase();
        criteria.add(example);

        @SuppressWarnings("unchecked")
        List<Entity> list = criteria.list();
        return list;
    } catch (HibernateException he) {
        return null;
    }
}

Но, согласно моему опыту и документации, ассоциации при этом игнорируются.Поэтому моя коллекция строк для otherNames игнорируется, поскольку она представлена ​​в базе данных как ассоциация (один ко многим).

В идеале я хотел бы иметь возможность создать объект Entity Object и добавить otherName тогда я смогу найти любые сущности, в которых одна из их коллекций otherName s соответствует аргументу.

Я пытался сделать:

SortedSet<String> names = exampleObject.getNames();
if (names != null && !names.isEmpty()) {
    Criteria newCriteria = criteria.createCriteria("mappedNames");
    newCriteria.add(Restrictions.in("string", exampleObject.getNames()));
}

Где строковые литералыздесь представлены имена столбцов, используемых в БД.Это работает в том смысле, что он объединяет таблицы и возвращает результаты, когда один из otherName в БД соответствует критериям.Но я получаю дубликаты, потому что, если у сущности есть два других имени и критерии поиска ищут их оба, они отображаются как два результата, потому что объединение создает две строки, представляющие одну и ту же сущность, но с каждым из двух других имен.Например:

Entity:
    longName:foo
    shortName:bar
    otherNames:
        a
        b

приведет к двум строкам для объединения:

foo, bar, a
foo, bar, b

Так что, когда я делаю attribute.list, он возвращает два объекта Entity, оба из которых являются одним и тем же объектом..

Кто-нибудь знает лучший способ сделать поиск на примере с использованием Hibernate, где поиск действительно смотрит на ассоциацию (которая в данном случае является простой ассоциацией с коллекцией строк)?

1 Ответ

1 голос
/ 10 февраля 2012

Я думаю, что нашел ответ сам, по крайней мере, до такой степени, что он работает для меня. Я все еще заинтересован в других входных данных, но сейчас это то, что я сделал:

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

это говорит о том, что он должен возвращать различные сущности, а в случае присоединения любой таблицы - только корневую сущность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...