Spring Data JPA Redis: невозможно написать запрос на основе пользовательского метода

Я настроил 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

Что происходит, когда вы вызываете этот метод? Есть ошибка? Получено нулевое значение?

François Dupire 29.06.2018 14:33

В ответ я получаю пустой объект.

Ayush Nigam 29.06.2018 14:35

Идентифицируют ли пол и класс данные? В противном случае вы должны вернуть список, а не объект signle. Кроме того, но я не уверен, что это обязательно, но я думаю, вы должны использовать findOne для возврата одного объекта и findAll для возврата коллекции (хотя это необходимо проверить)

François Dupire 29.06.2018 14:38

покажите свой класс RedisEntity

pvpkiran 29.06.2018 14:43

Кажется, что Spring Data может сделать вывод из подписи, должен ли он возвращать один или набор сущностей, если вы используете findBy. Используя findOneBy и findAllBy, вы обеспечиваете возврат отдельной сущности или коллекции.

François Dupire 29.06.2018 14:45

Можно ли увидеть ваш класс конфигурации?

François Dupire 03.07.2018 11:32

Конечно @ FrançoisDupire

Ayush Nigam 06.07.2018 12:10

Спасибо @AyushNigam! Что произойдет, если вы добавите @EnableRedisRepositories в свой класс конфигурации?

François Dupire 06.07.2018 17:54

Возможно, вам потребуется добавить @Indexed к gender и grade, чтобы находки работали.

Josh J 22.08.2018 18:09

@JoshJ, ты спас мне день, спасибо, чувак :)

Orhan Gazi 17.01.2021 21:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
4
10
2 543
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У нас есть библиотека 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.

Ayush Nigam 30.06.2018 15:03
Ответ принят как подходящий

Как упомянуто @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;

}

Другие вопросы по теме