Ошибка при использовании сортировки QueryDSL с модулем поиска Hibernate

В моем классе репозитория я пытаюсь сделать запрос, используя модуль querydsl-hibernate-search версии 4.1.4 вместе с Spring Data JPA версии 1.5.2. Когда я вызываю метод:

public Iterable<Incident> findAll(Predicate predicate, int offset, int limit, OrderSpecifier<?>[] orders) {
    return createQuery(predicate).orderBy(orders).offset(offset).limit(limit).fetch();
}

Этот звонок:

private SearchQuery<Incident> createQuery(Predicate predicate) {
    return new SearchQuery<>(getEntityManager().unwrap(HibernateEntityManager.class).getSession(), incident).where(predicate);
}

У меня такая ошибка:

java.lang.NoSuchMethodError: org.apache.lucene.search.SortField.<init>(Ljava/lang/String;IZ)V

Заглянув внутрь источников кода, я обнаружил проблему, метод класса: LuceneSerializer, строка: 557:

public Sort toSort(List<? extends OrderSpecifier<?>> orderBys) {
    List<SortField> sorts = new ArrayList<SortField>(orderBys.size());
    for (OrderSpecifier<?> order : orderBys) {
        if (!(order.getTarget() instanceof Path<?>)) {
            throw new IllegalArgumentException("argument was not of type Path.");
        }
        Class<?> type = order.getTarget().getType();
        boolean reverse = !order.isAscending();
        Path<?> path = getPath(order.getTarget());
        if (Number.class.isAssignableFrom(type)) {
            sorts.add(new SortField(toField(path), sortFields.get(type), reverse));
        } else {
            sorts.add(new SortField(toField(path), sortLocale, reverse));
        }
    }
    Sort sort = new Sort();
    sort.setSort(sorts.toArray(new SortField[sorts.size()]));
    return sort;
}

Метод конструктора класса SortField имеет неверные параметры:

sorts.add(new SortField(toField(path), sortFields.get(type), reverse));

Мне кажется, это проблема конфликта версий между querydsl-hibernate-seach и lucene.


person Marcelo Martins    schedule 08.04.2017    source источник
comment
Это определенно похоже на конфликт версий. Какие версии Lucene и Hibernate Search вы используете?   -  person yrodiere    schedule 10.04.2017
comment
Предложение: не ожидайте, что вы можете взять любые две библиотеки и что они будут работать вместе. Вам нужно выбрать их в определенных комбинациях, чтобы версии совпадали. В идеале полное согласование версий, но поскольку это часто нецелесообразно, по крайней мере, попробуйте сопоставить основные / дополнительные версии. В этом случае проверьте версии Apache Lucene, используемые вашим выбором Hibernate Search, но вы также захотите проверить совместимость Hibernate ORM с вашим выбором Spring Data.   -  person Sanne    schedule 10.04.2017
comment
версия spring-boot-starter: 1.5.2.RELEASE, hibernate-search-orm - версия: 5.5.6.Final и querydsl-hibernate-search версия: 4.1.4   -  person Marcelo Martins    schedule 12.04.2017
comment
@ YoannRodière Я нашел свойство конфигурации: spring.jpa.properties.hibernate.search.lucene_version, которое можно поместить в файл application.properties, но я не знаю, какое значение более подходящее ...   -  person Marcelo Martins    schedule 12.04.2017


Ответы (1)


Из того, что я вижу, здесь, querydsl-hibernate-search зависит от старой версии Hibernate Search (4.2.0.Final). Я бы не ожидал, что он будет работать с Hibernate Search 5.5.6.

Начиная с версии 4.2.0.Final произошло много всего, поэтому я думаю, у вас есть только два варианта:

Вы можете использовать querydsl-hibernate-search как есть, но это заставит вас использовать действительно старую версию Hibernate Search (не даже в руководстве по миграции), что, кстати, заставит вас использовать старую версию Hibernate ORM и так далее ...

person yrodiere    schedule 12.04.2017
comment
Благодарю за ваш ответ. Я согласен. Недавно я открыл вопрос по этой проблеме. - person Marcelo Martins; 16.04.2017