Я настроил Spring Data JPA с Redis и использую RedisRepositories с такими методами, как find(), findAll() и т. д. Все эти методы работают нормально, но я не могу написать свой собственный метод, например.
RedisEntity findByGenderAndGrade(String gender, String grade);
RedisEntity - это простой класс POJO Entity. Если вам нужна дополнительная информация, дайте мне знать в сообщениях.
Вот моя сущность:
@Data
@RedisHash("test1")
public class RedisEntity implements Serializable {
@Id
@GeneratedValue
private String id;
private String name;
private String gender;
private Integer grade;
}
Репозиторий:
@Repository
public interface TestRepository extends JpaRepository<RedisEntity, String> {
List<RedisEntity> findAllByGender(String gender);
List<RedisEntity> findAllByGrade(Integer grade);
}
Сервис / Контроллер:
@Override
public List<RedisEntity> getById(String id) {
return testRepository.findById(id); //returns data perfectly.
}
@Override
public List<RedisEntity> getAllByGender(String gender) {
return testRepository.findAllByGender(gender); //returns []
}
@Override
public void saveEntity(RedisEntity redisEntity) {
testRepository.save(redisEntity); // saves it in redis perfectly.
}
Также, findByGender и findAllByGender дают [], хотя я могу видеть данные в своей базе данных redis и также сохранять их.
По просьбе FrançoisDupire,
@Configuration
public class RedisConfig {
@Autowired
private DeploymentProperties deploymentProperties;
private static Logger logger = LoggerFactory.getLogger(RedisConfig.class);
@Bean
JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("localhost", 6379);
redisStandaloneConfiguration.setPassword(RedisPassword.of("root"));
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
return template;
}
}
Также я сослался на эту статью: Статья Baeldung о Redis данных Spring
В ответ я получаю пустой объект.
Идентифицируют ли пол и класс данные? В противном случае вы должны вернуть список, а не объект signle. Кроме того, но я не уверен, что это обязательно, но я думаю, вы должны использовать findOne для возврата одного объекта и findAll для возврата коллекции (хотя это необходимо проверить)
покажите свой класс RedisEntity
Кажется, что Spring Data может сделать вывод из подписи, должен ли он возвращать один или набор сущностей, если вы используете findBy. Используя findOneBy и findAllBy, вы обеспечиваете возврат отдельной сущности или коллекции.
Можно ли увидеть ваш класс конфигурации?
Конечно @ FrançoisDupire
Спасибо @AyushNigam! Что произойдет, если вы добавите @EnableRedisRepositories в свой класс конфигурации?
Возможно, вам потребуется добавить @Indexed к gender и grade, чтобы находки работали.
@JoshJ, ты спас мне день, спасибо, чувак :)




У нас есть библиотека Spring Data Redis, которая предоставляет возможности для написания настраиваемого метода. Прикрепление образца кода.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.0.8.RELEASE</version>
</dependency>
Определение сущности
@Data
@RedisHash("EmployeeDetails")
public class RedisEntity {
@Id
private String employeeId;
private String firstName;
private String lastName;
private String gender;
private String grade;
}
Определение репозитория
@Repository
public interface RedisEntityRepository extends CrudRepository<RedisEntity, String>{
List<RedisEntity> findAllByGenderAndGrade(String gender, String grade);
}
Выполнение
@Component
public class RedisEntityImpl implements RedisEntityService {
@Autowired
private RedisEntityRepository redisEntityRepository;
@Override
public List<RedisEntity> getAllByGenderAndGrade(String gender, String grade) {
return redisEntityRepository.findAllByGenderAndGrade(gender,grade);
}
}
Характеристики
spring.cache.type = redis
spring.redis.host = localhost
spring.redis.port = 6379
Проделал то же самое, но получил в ответ пустой массив. Хотя я мог сохранить данные с помощью redisEntityRepository.save (redisEntity) и получить от него ответ. Я также могу просматривать данные с помощью клиента Redis в базе данных Redis.
Как упомянуто @JoshJ и проверено мной и другими, Решение проблемы:
Добавление аннотации @Indexed ко всем тем столбцам / полям, которые необходимо использовать со всеми находками.
@Data
@RedisHash("EmployeeDetails")
public class RedisEntity {
@Id
private String employeeId;
private String firstName;
private String lastName;
@Indexed
private String gender;
@Indexed
private String grade;
}
Что происходит, когда вы вызываете этот метод? Есть ошибка? Получено нулевое значение?