Spring Redis Data репозиторий: получить несколько хешей по идентификаторам одновременно - PullRequest
0 голосов
/ 31 мая 2018

Вопрос

Можно ли использовать репозитории Spring Data Redis для одновременного получения нескольких хешей?

Мой код, который не работает:

@RedisHash("Message")
public class Message implements Serializable {

    @Id
    private String id;
    private String text;
    private LocalDateTime posted;
    private Integer upvotes;
    private String authorId;
}

@Repository
public interface MessageRepository extends CrudRepository<Message, String> {
    // Got: IN (1): [IsIn, In]is not supported for redis query derivation
    Set<Message> getByIdIn(Set<String> ids); 
}

Обходной путь

В настоящее время я использую RestTemplate#executePipelined, но я нашел этот подход громоздким:

public Set<Message> getMessagesById(Set<String> ids) {

        // I had to implement custom mapper since BeanUtilsHashMapper fails on LocalDateTime deserialization from String
        HashMapper<Message, String, String> mapper = new DTOConverter<>(Message.class);

        List<Object> messages = template.executePipelined((RedisCallback<Object>) connection -> {
            StringRedisConnection conn = (StringRedisConnection) connection;
            ids.stream()
                    .map(id -> "Message:" + id)
                    .forEach(conn::hGetAll);
            return null;
        });

        return messages.stream()
                .map(o -> (Map<String, String>) o)
                .map(o -> mapper.fromHash(o))
                .collect(toSet());
}

Есть ли способ пройти mapperдо executePipelined?

...