Я работаю над моделью предметной области, использующей 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, где поиск действительно смотрит на ассоциацию (которая в данном случае является простой ассоциацией с коллекцией строк)?