使用Hibernate Search模块进行QueryDSL排序时出错

时间:2017-04-08 20:45:11

标签: java lucene querydsl hibernate-search

在我的存储库类中,我尝试使用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之间的版本冲突问题。

1 个答案:

答案 0 :(得分:0)

从我所看到的herequerydsl-hibernate-search取决于古老版本的Hibernate Search(4.2.0.Final)。我不希望它与Hibernate Search 5.5.6一起使用。

自4.2.0以来,很多事情都在发生。最终,所以我认为你只有两个选择:

您可以按原样使用querydsl-hibernate-search,但它会强制您使用真正旧版本的Hibernate Search(not even on the migration guide anymore),这会偶然迫使您使用旧版本的Hibernate ORM,以及等......