Arhn - архитектура программирования

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

Я настроил Spring Data JPA с Redis и использую RedisRepositories с такими методами, как find(), findAll() и т. д. Все эти методы работают нормально, но я не могу написать свой собственный метод, например.

RedisEntity findByGenderAndGrade (пол строки, оценка строки);

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 и также сохранять их.

По просьбе Франсуа Дюпира,

@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 о Spring data redis


  • Что происходит, когда вы вызываете этот метод? Есть ли ошибка? Извлекается ли нулевое значение? 29.06.2018
  • В ответ получаю пустой объект. 29.06.2018
  • Являются ли пол и класс идентифицирующими данными? Если нет, вы должны вернуть список, а не объект signle. Кроме того, но я не уверен, что это обязательно, но я думаю, что вы должны использовать findOne для возврата одного объекта и findAll для возврата коллекции (хотя это необходимо проверить) 29.06.2018
  • покажи свой класс RedisEntity 29.06.2018
  • Кажется, что Spring Data может сделать вывод из подписи, если он должен возвращать один или набор объектов, если вы используете findBy. Используя findOneBy и findAllBy, вы принудительно возвращаете один объект или коллекцию. 29.06.2018
  • Можно ли увидеть ваш класс конфигурации? 03.07.2018
  • Конечно @FrançoisDupire 06.07.2018
  • Спасибо @AyushNigam! Что произойдет, если вы добавите @EnableRedisRepositories в свой класс конфигурации? 06.07.2018
  • Возможно, вам придется добавить @Indexed к gender и grade, чтобы находки работали. 22.08.2018
  • @JoshJ, ты спас мой день, спасибо, чувак :) 17.01.2021

Ответы:


1

У нас есть библиотека 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
29.06.2018
  • Проделал то же самое, но получил в ответ пустой массив. Хотя я мог бы сохранить данные с помощью redisEntityRepository.save(redisEntity) и получить ответ. Я также могу видеть данные с помощью клиента Redis в базе данных Redis. 30.06.2018

  • 2

    Как упоминалось @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;
    
    }
    
    20.01.2021
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..