Вопрос
Можно ли использовать репозитории 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
?