在我的资源库类中,我试图使用querydsl-hibernate-search模块版本4.1.4与Spring Data JPA版本1.5.2一起进行查询。当我打电话的方法:在Hibernate搜索模块中使用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,line: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-休眠-SEACH和Lucene之间的版本冲突问题。
它肯定看起来像版本冲突。您正在使用哪个版本的Lucene和Hibernate Search? –
建议:不要指望你可以带任何两个图书馆,并且他们会一起工作。您需要按特定组合选取它们,以便版本对齐。理想情况下是完整的版本对齐方式,但由于这通常不实际,至少要尝试匹配主要/次要版本。在这种情况下,请检查您选择的Hibernate Search所使用的Apache Lucene版本,但您还需要检查Hibernate ORM是否与您选择的Spring Data兼容。 – Sanne
spring-boot-starter版本:1.5.2.RELEASE,hibernate-search-orm - 版本:5.5.6.Final和querydsl-hibernate-search版本:4.1.4 –