私のリポジトリクラスで、querydsl-hibernate-searchモジュール、バージョン4.1.4、およびSpring Data JPAバージョン1.5.2を使用してクエリを作成しようとしています。私はメソッドを呼び出すとき:Hibernate SearchモジュールでQueryDSLソートを使用する際のエラー
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-休止状態-さがすとLuceneの間のバージョンの競合の問題があります。
これは確かにバージョンの競合のようです。 LuceneとHibernate Searchのどのバージョンを使用していますか? –
提案:任意の2つの図書館を利用でき、それらが一緒に働くことは期待しないでください。特定の組み合わせで選択して、バージョンが整列するようにする必要があります。理想的には完全なバージョンアライメントですが、メジャー/マイナーバージョンとのマッチングを試みるのは実用的ではないことが多いためです。この場合、選択したHibernate Searchで使用されているApache Luceneのバージョンを確認しますが、選択したSpring DataとのHibernate ORMの互換性もチェックしてください。 – Sanne
spring-boot-starterバージョン:1.5.2.RELEASE、hibernate-search-orm - バージョン:5.5.6.Finalおよびquerydsl-hibernate-検索バージョン:4.1.4 –