无法在 Spring 引导中使用 Crud 存储库从 Redis 获取结果?
Unable to get result from the Redis using Crud Repository in Spring Boot?
我正在开发 Spring Boot + Redis 示例。我参考了 link : https://www.baeldung.com/spring-data-redis-tutorial。在此示例中,我开发了存储库方法 Student findByNameAndGender(String name, Gender gender);
甚至 Student findByName(String name);
,但在这两种情况下我都没有得到任何结果。?
有任何快速帮助吗? Redis 查询 -
redis 127.0.0.1:6379> KEYS *
1) "Student"
2) "Student:bb4df14a-7f42-4fc3-b608-fc4b7d45109e"
3) "Student:69affaa4-e56c-49e3-9ef4-1cd7509d299b"
redis 127.0.0.1:6379>
Student.java
@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
@RedisHash("Student")
public class Student {
public enum Gender {
MALE, FEMALE
}
private String id;
private String name;
private Gender gender;
private int grade;
}
StudentRepository.java
@Repository
public interface StudentRepository extends CrudRepository<Student, String>{
Student findByNameAndGender(String name, Gender gender);
}
RedisConfig.java
@Configuration
@EnableRedisRepositories
public class RedisConfig {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory();
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(jedisConnectionFactory());
template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
return template;
}
}
SpringDataRedisEugenpApplication.java
@SpringBootApplication
public class SpringDataRedisEugenpApplication implements CommandLineRunner{
@Autowired
private StudentRepository repository;
public static void main(String[] args) {
SpringApplication.run(SpringDataRedisEugenpApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
repository.save(Student.builder().name("John").gender(Student.Gender.MALE).grade(1).build());
repository.save(Student.builder().name("Michael").gender(Student.Gender.MALE).grade(2).build());
Iterable<Student> students = repository.findAll();
for (Student student : students) {
System.out.println("=============================");
System.out.println("Details ? "+student.toString());
}
Student s = repository.findByNameAndGender("John", Student.Gender.MALE);
System.out.println("Student ="+s.toString()); //line-34
}
}
错误-
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:795) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:776) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at com.baeldung.SpringDataRedisEugenpApplication.main(SpringDataRedisEugenpApplication.java:19) [classes/:na]
Caused by: java.lang.NullPointerException: null
at com.baeldung.SpringDataRedisEugenpApplication.run(SpringDataRedisEugenpApplication.java:34) [classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:792) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
... 5 common frames omitted
很少有查询 -
1) How to see actual data stored in the redis?
2) How we can control Id to be started from one ?
edis 127.0.0.1:6379> get Student:1
(error) ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379> get Student:2
(error) ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379>
我真的很难看
redis 127.0.0.1:6379> mget Student:1
1) (nil)
redis 127.0.0.1:6379> mget Student:2
1) (nil)
redis 127.0.0.1:6379> mget Student
1) (nil)
我自己能够找出以下问题的答案。
您只需在字段级别添加 @Index
注释。 @Index
注释将 属性 标记为索引,它使用 Redis {@literal SET} 来跟踪具有匹配值的对象。
@Indexed
private String name;
@Ref: https://scalegrid.io/blog/introduction-to-redis-data-structures-hashes/
1) How to see actual data stored in the redis?
redis 127.0.0.1:6379> hgetall Student:1
1) "_class"
2) "com.baeldung.spring.data.redis.model.Student"
3) "id"
4) "1"
5) "name"
6) "John Doe"
7) "gender"
8) "MALE"
9) "grade._class"
10) "java.lang.Integer"
11) "grade"
12) "1"
redis 127.0.0.1:6379> hgetall Student:2
1) "_class"
2) "com.baeldung.spring.data.redis.model.Student"
3) "id"
4) "2"
5) "name"
6) "Michael Harford"
7) "gender"
8) "MALE"
9) "grade._class"
10) "java.lang.Integer"
11) "grade"
12) "2"
我正在开发 Spring Boot + Redis 示例。我参考了 link : https://www.baeldung.com/spring-data-redis-tutorial。在此示例中,我开发了存储库方法 Student findByNameAndGender(String name, Gender gender);
甚至 Student findByName(String name);
,但在这两种情况下我都没有得到任何结果。?
有任何快速帮助吗? Redis 查询 -
redis 127.0.0.1:6379> KEYS *
1) "Student"
2) "Student:bb4df14a-7f42-4fc3-b608-fc4b7d45109e"
3) "Student:69affaa4-e56c-49e3-9ef4-1cd7509d299b"
redis 127.0.0.1:6379>
Student.java
@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
@RedisHash("Student")
public class Student {
public enum Gender {
MALE, FEMALE
}
private String id;
private String name;
private Gender gender;
private int grade;
}
StudentRepository.java
@Repository
public interface StudentRepository extends CrudRepository<Student, String>{
Student findByNameAndGender(String name, Gender gender);
}
RedisConfig.java
@Configuration
@EnableRedisRepositories
public class RedisConfig {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory();
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(jedisConnectionFactory());
template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
return template;
}
}
SpringDataRedisEugenpApplication.java
@SpringBootApplication
public class SpringDataRedisEugenpApplication implements CommandLineRunner{
@Autowired
private StudentRepository repository;
public static void main(String[] args) {
SpringApplication.run(SpringDataRedisEugenpApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
repository.save(Student.builder().name("John").gender(Student.Gender.MALE).grade(1).build());
repository.save(Student.builder().name("Michael").gender(Student.Gender.MALE).grade(2).build());
Iterable<Student> students = repository.findAll();
for (Student student : students) {
System.out.println("=============================");
System.out.println("Details ? "+student.toString());
}
Student s = repository.findByNameAndGender("John", Student.Gender.MALE);
System.out.println("Student ="+s.toString()); //line-34
}
}
错误-
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:795) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:776) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
at com.baeldung.SpringDataRedisEugenpApplication.main(SpringDataRedisEugenpApplication.java:19) [classes/:na]
Caused by: java.lang.NullPointerException: null
at com.baeldung.SpringDataRedisEugenpApplication.run(SpringDataRedisEugenpApplication.java:34) [classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:792) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
... 5 common frames omitted
很少有查询 -
1) How to see actual data stored in the redis?
2) How we can control Id to be started from one ?
edis 127.0.0.1:6379> get Student:1
(error) ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379> get Student:2
(error) ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379>
我真的很难看
redis 127.0.0.1:6379> mget Student:1
1) (nil)
redis 127.0.0.1:6379> mget Student:2
1) (nil)
redis 127.0.0.1:6379> mget Student
1) (nil)
我自己能够找出以下问题的答案。
您只需在字段级别添加 @Index
注释。 @Index
注释将 属性 标记为索引,它使用 Redis {@literal SET} 来跟踪具有匹配值的对象。
@Indexed
private String name;
@Ref: https://scalegrid.io/blog/introduction-to-redis-data-structures-hashes/
1) How to see actual data stored in the redis?
redis 127.0.0.1:6379> hgetall Student:1
1) "_class"
2) "com.baeldung.spring.data.redis.model.Student"
3) "id"
4) "1"
5) "name"
6) "John Doe"
7) "gender"
8) "MALE"
9) "grade._class"
10) "java.lang.Integer"
11) "grade"
12) "1"
redis 127.0.0.1:6379> hgetall Student:2
1) "_class"
2) "com.baeldung.spring.data.redis.model.Student"
3) "id"
4) "2"
5) "name"
6) "Michael Harford"
7) "gender"
8) "MALE"
9) "grade._class"
10) "java.lang.Integer"
11) "grade"
12) "2"