Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何过滤Hibernate搜索结果,以便在排序过程中仅包含在具有特殊字段值的对象之后的对象?_Java_Hibernate_Lucene_Hibernate Search - Fatal编程技术网

Java 如何过滤Hibernate搜索结果,以便在排序过程中仅包含在具有特殊字段值的对象之后的对象?

Java 如何过滤Hibernate搜索结果,以便在排序过程中仅包含在具有特殊字段值的对象之后的对象?,java,hibernate,lucene,hibernate-search,Java,Hibernate,Lucene,Hibernate Search,我的存储库中有curent方法: List<Record> getSortedByDate(int limit, int lastId){ FullTextSession fullTextSession = fullTextSession(); QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Record.class).get(

我的存储库中有curent方法:

List<Record> getSortedByDate(int limit, int lastId){ 

    FullTextSession fullTextSession = fullTextSession();
    QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Record.class).get();
    // some extra matching

    FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(finalQuery, Record.class);
    fullTextQuery.setMaxResults(limit);
    fullTextQuery.setSort(new Sort(new SortField("created", SortField.Type.LONG, false)));

    // ??? here I have to restrict results to include all records with id
    // which is after lastId in context of current sort

    return fullTextQuery.list(); 
}
我正在使用“已创建”字段对搜索结果进行排序:

我只需要返回那个些对象,它们位于这个排序上下文中具有给定“id”字段值的对象之后。例如,如果索引中有3条记录:

{"id": 3, "created": "27.04.13"},
{"id": 1, "created": "29.04.15"},
{"id": 4, "created": "7.10.15"}
我的方法接收
lastId
1,它必须只返回最后一条记录

我需要这样做,因为我必须通过排序实现正确的分页

更新 此外,将来我不仅需要按日期进行排序,还需要按其他字段进行排序,例如
评级
(整数)和
ReviewCount
(整数),因此按范围限制结果可能不是一个解决方案,因为多个记录可能具有相同的评级或相同的ReviewCount

更新2 我把@Gunnar的答案和这种过滤结合起来,看起来效果不错

Date limitValue = session().get(Record.class, lastId).getCreated();
mainJunction.must(queryBuilder.range().onField("created").above(limitValue).createQuery());
mainJunction.must(queryBuilder.phrase().onField("id").sentence(String.valueOf(lastId)).createQuery()).not();

…其中
session()
是Hibernate DB会话。现在我可以安全地使用
评级
ReviewCount
排序。

您可以加载具有给定id的
记录
,然后将查询结果限制为在该日期之后创建的记录:

Record lastRecord = ...;

QueryBuilder queryBuilder = fullTextSession
    .getSearchFactory()
    .buildQueryBuilder()
    .forEntity(Record.class).get();

Query query = queryBuilder.range()
    .onField( "created" )
    .above( lastRecord.getCreated() )
    .createQuery();

FullTextQuery fullTextQuery = fulllTextSession.createFullTextQuery(
    query, Record.class
);

当在同一天创建的多个记录中包装页面时,您可能只需要选择比
DAY
更精细的日期分辨率,以获得正确的排序。

非常感谢您的回复,但无论如何,相同日期的情况是可能的(如果以编程方式几乎同时添加记录)。另外,请参阅我的问题的更新。我将非常感谢您对如何处理这种情况的建议。您的意思是先按日期排序,然后按评级等排序(即一个排序包含多个字段)?或按日期、评级或审查评级等排序?按日期、评级或审查计数排序。目前我已经找到了一些解决方案,我将您的答案与排除id为lastId的记录相结合。请参阅更新。但我不知道这是否是最好的方法。
Record lastRecord = ...;

QueryBuilder queryBuilder = fullTextSession
    .getSearchFactory()
    .buildQueryBuilder()
    .forEntity(Record.class).get();

Query query = queryBuilder.range()
    .onField( "created" )
    .above( lastRecord.getCreated() )
    .createQuery();

FullTextQuery fullTextQuery = fulllTextSession.createFullTextQuery(
    query, Record.class
);