Как добавить Distinct в Hibernate Criteria
В моей базе данных есть тестовая таблица с столбцами: testName, testType
есть 2 разных теста с тем же типом Ie "SUN", поэтому я хочу только один из них, для которого я использую Distinct в моем спящем/критерии, как показано ниже, но он все еще дает мне оба типа с тем же именем, что и "солнце",
Criteria crit = session.createCriteria(Test.class);
final ResultTransformer trans = new DistinctRootEntityResultTransformer();
crit.setResultTransformer(trans);
List rsList = trans.transformList(crit.list());
Любая идея, какова может быть причина, или любой другой способ фильтрации дубликатов.
Ответы
Ответ 1
Используйте Projections.distinct.
Criteria crit = session.createCriteria(Test.class).setProjection(
Projections.distinct(Projections.projectionList()
.add(Projections.property("type"), "type") )
.setResultTransformer(Transformers.aliasToBean(YourBean.class));
List lst = crit.list();
где YourBean.class имеет свойство "type". Возвращаемый список будет List<YourBean>
.
Ответ 2
Попробуйте использовать:
cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Он отлично работает для меня
Ответ 3
Я, наконец, обнаружил, что получил значения других столбцов:
Criteria criteria = session.createCriteria(Test.class);
ProjectionList projectionList = Projections.projectionList();
ProjectionList projectionList2 = Projections.projectionList();
projectionList2.add(Projections.distinct(projectionList.add(Projections.property("distinctColumn"), "distinctColumn")));
projectionList2.add(Projections.property("col1"), "col1");
projectionList2.add(Projections.property("col2"), "col2");
criteria.setProjection(projectionList2);
criteria.setResultTransformer(Transformers.aliasToBean(Test.class));
List list = criteria.list();
Ответ 4
Попробуйте использовать:
Criteria criteria =
session.createCriteria(Test.class).setProjection(
Projections.distinct(Projections.property("testType")));
List<Test> rsList = criteria.list();
Ответ 5
Имела ту же проблему и в итоге решила использовать проекцию Group By, а затем добавила во все нужные мне колонки. Например
Criteria query = session.createCriteria(Class.class)
.setProjection(Projections.projectionList()
.add(Projections.groupProperty("Col1"), "Col1")
.add(Projections.groupProperty("Col2"), "Col2"))
.setResultTransformer(Transformers.aliasToBean(Class.class));
List list = query.list();
Ответ 6
Пытаться
setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
Criteria crit = session.createCriteria(Test.class);
List list = crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
Ответ 7
Проецирование обеспечивает результат только для отмеченных свойств. но это создает проблему для дочерних объектов. См. Мой пост для реальной проблемы, с которой я столкнулся.
Структура спящего режима: структура родительских и дочерних отношений
Ответ 8
Попробуйте использовать:
criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);
Он использует хеш-коды по умолчанию для поиска совпадений в результатах.
Благодарю.