2017-04-08 244 views
1

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

+0

它肯定看起来像版本冲突。您正在使用哪个版本的Lucene和Hibernate Search? –

+0

建议:不要指望你可以带任何两个图书馆,并且他们会一起工作。您需要按特定组合选取它们,以便版本对齐。理想情况下是完整的版本对齐方式,但由于这通常不实际,至少要尝试匹配主要/次要版本。在这种情况下,请检查您选择的Hibernate Search所使用的Apache Lucene版本,但您还需要检查Hibernate ORM是否与您选择的Spring Data兼容。 – Sanne

+0

spring-boot-starter版本:1.5.2.RELEASE,hibernate-search-orm - 版本:5.5.6.Final和querydsl-hibernate-search版本:4.1.4 –

回答

0

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

很多事情已经持续了自4.2.0.Final,所以我觉得你只有两个选择:

你可以使用querydsl-hibernate-search原样,但它会迫使你用一个真的老版本的Hibernate搜索(not even on the migration guide anymore),将偶发强制你使用旧版本的Hibernate ORM,等等......

+0

谢谢你的回应。我赞同你。我最近开了一个关于这个问题的问题。 –