It would be great if findOne(id) and findOne(Predicate) methods returned Optional.
Also, it would be great if QueryDslPredicateExecutor#findAll methods returned List instead of Iterable as converting Iterable -> Stream is a lot more cumbersome compared to List -> Stream. One thing to consider is to switch to Stream as default and then the user can decide what he wants to do with it?
The former is already in place in the feature branch.
The latter is more problematic. The reason we use Iterable here is the we don't want to dictate implementations to have to collect all the data into a List upfront and we most certainly won't gonna switch to that. Returning a Stream in the first place is not an option either as it can only be consumed once. Currently the feature branch contains a type Streamable that extends and works on Iterable instances and has a stream() method that will just return a default, non-parallel stream. That gives you the convenience of being able to get a Stream easily but also allows implementations to work with Iterable instances in their implementation and just return a Streamable.of(iterable) eventually