spring-data-jpa 如何在Spring中使用QueryDSL predicate 处理日期范围?

deikduxw  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(234)

我有一个包含各种事件的数据库,以及一个相应的实体:

@NoArgsConstructor
@Data
@Table(name="Event")
public class Event {
    @Id
    private String id;
    private String source;
    private String action;
    private Date timestamp;
    private String data;
}

以及一个控制器,它接受QueryDSLPredicate和参数:

@GetMapping("/events")
    public List<Event> getEvents(@QuerydslPredicate(root = Event.class) Predicate predicate,
                                           @RequestParam(name = "id", required = false) String id,
                                           @RequestParam(name = "source", required = false) String source,
                                           @RequestParam(name = "action", required = false) String action,
                                           @RequestParam(name = "startTimestamp", required = false) String startTimestamp,
                                           @RequestParam(name = "endTimestamp", required = false) String endTimestamp,
                                           @RequestHeader(required = false) String requestId) {
        return StreamSupport.stream(eventRepository.findAll(predicate).spliterator(), false).collect(Collectors.toList());

这对于发送http://localhost:8080/events?source=testSource&action=testAction这样的指定参数非常有效
但是,如何通过发送starttime和endtime并提取这些时间之间的所有事件来处理日期范围呢?我是querydsl/spring的新手(事实上,我从大学开始就没有写过java),似乎找不到一个很好的例子来说明如何做到这一点。

lpwwtiir

lpwwtiir1#

在此答案https://stackoverflow.com/a/35158320/2930025的帮助下获得此功能
更改了我的控制器,如下所示:

@GetMapping("/events")
    public List<Event> getEvents(@QuerydslPredicate(root = Event.class) Predicate predicate,
                                           @RequestHeader(required = false) String requestId) {
        return StreamSupport.stream(eventRepository.findAll(predicate).spliterator(), false).collect(Collectors.toList());

然后添加了一个重载的customize方法到仓库类中:

@Repository
public interface EventRepository extends JpaRepository<Event,String>, QuerydslPredicateExecutor<Event>, QuerydslBinderCustomizer<QAuditEvent> {
        @Override
    default void customize(QuerydslBindings bindings, QEvent root) {
        bindings.bind(root.timestamp).all((path, value) ->
        {
            Iterator<? extends Date> it = value.iterator();
            return Optional.ofNullable(path.between(it.next(), it.next()));
        });
    }
}

然后,要调用,只需发送两个时间戳,一个用于startTime,一个用于endTime:

http://localhost:8080/events?timestamp=2022-07-05T22:16:18Z&timestamp=2022-08-27T22:16:18Z

看起来第二个答案的链接问题也将工作,但我不能得到正确的导入工作,所以去与接受答案的方法。

相关问题