Fed*_*zza 5 java spring redis spring-data spring-data-redis
我正在使用如下存储库使用 spring-data-redis 测试 Redis:
public interface CreditCardRepository extends CrudRepository<CreditCard, String>{
List<CreditCard> findByIssuer(String issuer);
List<CreditCard> findByCreditNetwork(String creditNetwork);
List<CreditCard> findByCreditNetworkAndIssuer(String creditNetwork, String issuer);
}
Run Code Online (Sandbox Code Playgroud)
上述方法将查询 Redis 结构,例如:
creditcard:creditNetwork:mastercard
creditcard:creditNetwork:visa
creditcard:issuer:company1
creditcard:issuer:company2
Run Code Online (Sandbox Code Playgroud)
现在我的 CreditCard 对象包含两个属性(发行者、网络和 ID),所以很容易搜索这样的对象:
private List<CreditCard> searchCardFromCache(CreditCardGetReq req) {
if (req.getIssuer() != null && req.getNetwork() != null) {
return ccRepository.findByIssuerAndCreditNetwork(req.getIssuer(), req.getNetwork().name());
}
if (req.getIssuer() != null) {
return ccRepository.findByIssuer(req.getIssuer());
}
if (req.getNetwork() != null) {
return ccRepository.findByCreditNetwork(req.getNetwork().name());
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
但是,我不喜欢这段代码,因为我必须创建所有属性的组合并且会非常混乱。将来,我计划拥有 15 个属性,因此“if”链是不可能的。
我想问一下,如何使用spring-data-redis创建动态查询,这样Redis可以比检查每个属性更好地返回基于对象属性的交集?
已尝试通过硬编码(我之前从存储库中删除findByIssuerAndCreditNetwork)使用 MethodHandle一个将动态生成的方法名称,如下所示:
MethodType methodType = MethodType.methodType(cardList.getClass(), String.class, String.class);
// Dynamic create 'findByIssuerAndCreditNetwork'
MethodHandle methodHandle = MethodHandles.lookup().findVirtual(CreditCardRepository.class, "findByIssuerAndCreditNetwork", methodType);
Run Code Online (Sandbox Code Playgroud)
但似乎 MethodHandle 不起作用,因为我收到以下错误:
java.lang.NoSuchMethodException:没有这样的方法:com.creditcard.dao.CreditCardRepository.findByIssuerAndCreditNetwork(String,String)ArrayList/invokeInterface
目前,不支持创建动态查询。听起来有点好像“按示例查询”可能就是您正在寻找的东西。Spring Data MongoDB 和 Spring Data JPA 已经实现了 Query by Examples。
\n\n数据存储模块创建一个查询来匹配示例域对象:
\n\nPerson person = new Person(); \nperson.setFirstname("Dave"); \n\nExample<Person> example = Example.of(person); \n\nMongoRepository repo = \xe2\x80\xa6\nList<Person> result = repo.findAll(example); // returns all objects that with Dave in firstname\nRun Code Online (Sandbox Code Playgroud)\n\nSpring Data Redis 目前不支持示例查询,但应该可以提供基本支持。
\n\n我创建了一个票证DATAREDIS-605来跟踪此功能的进度。
\n| 归档时间: |
|
| 查看次数: |
3264 次 |
| 最近记录: |