Подтвердить что ты не робот

Как добавить 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());

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

4b9b3361

Ответ 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();

Ответ 8

Попробуйте использовать:

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

Он использует хеш-коды по умолчанию для поиска совпадений в результатах.

Благодарю.