【问题标题】:Spring Data JPA Redis : Cannot write custom method based querySpring Data JPA Redis:无法编写基于自定义方法的查询
【发布时间】:2018-06-29 12:31:42
【问题描述】:

我已经使用 Redis 配置了 Spring Data JPA,并使用 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 数据库中看到数据并保存它。

应 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 article on Spring data redis

【问题讨论】:

  • 调用这个方法会发生什么?有错误吗?是否检索到空值?
  • 我得到一个空对象作为响应。
  • 是性别和年级识别数据吗?如果不是,您应该返回一个列表而不是一个信号对象。另外,但我不确定它是否是强制性的,但我认为您必须使用 findOne 返回单个实体并使用 findAll 返回集合(但必须检查)
  • 您可能需要将 @Indexed 添加到 gendergrade 才能使查找结果起作用。
  • @JoshJ 你救了我,谢谢老兄:)

标签: spring-boot redis java-8 spring-data-jpa spring-repositories


【解决方案1】:

正如@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;

}

【讨论】:

    【解决方案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 客户端查看数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2019-07-10
    • 2016-04-16
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多