Spring Data JPA Redis:无法编写基于自定义方法的查询。

6
我已经配置了Spring Data JPA与Redis,并使用RedisRepositories提供的方法,如find()findAll()等。所有这些方法似乎都很好用,但我无法编写自定义方法,例如:

RedisEntity findByGenderAndGrade(String gender, String grade);

RedisEntity是一个简单的POJO实体类。如果您需要更多信息,请在消息中告诉我。

以下是我的实体:

@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;
    }
}

另外,我还参考了这篇文章:Spring data redis的Baeldung文章


调用此方法会发生什么?是否会出现错误?是否会检索到空值? - François Dupire
我在响应中得到了一个空对象。 - Ayush Nigam
展示你的 RedisEntity 类。 - pvpkiran
6
你可能需要在 gendergrade 上添加 @Indexed 才能使查找功能正常工作。 - Josh J
2
@JoshJ 你救了我的一天,谢谢你,老兄 :) - Orhan Gazi
显示剩余5条评论
2个回答

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

}

0
我们有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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接