gpt4 book ai didi

java - 如何使用 Spring Data Redis Repositories 构建动态查询?

转载 作者:IT王子 更新时间:2023-10-29 06:01:30 26 4
gpt4 key购买 nike

我正在使用这样的存储库使用 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);
}

以上方法将查询像这样的 Redis 结构:

creditcard:creditNetwork:mastercard
creditcard:creditNetwork:visa
creditcard:issuer:company1
creditcard:issuer:company2

现在我的 CreditCard 对象包含两个属性(issuer、network 和 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;
}

但是,我不喜欢这段代码,因为我必须创建所有属性的组合并且会非常困惑。将来,我计划拥有 15 个属性,因此“if”链是不可能的。

请问如何使用 spring-data-redis 创建动态查询,使 Redis 能够以比检查每个属性更好的方式返回基于对象属性的交集?

尝试通过硬编码使用 MethodHandle(我之前从存储库 findByIssuerAndCreditNetwork 中删除)一个方法名称,该名称将像这样动态生成:

MethodType methodType = MethodType.methodType(cardList.getClass(), String.class, String.class);
// Dynamic create 'findByIssuerAndCreditNetwork'
MethodHandle methodHandle = MethodHandles.lookup().findVirtual(CreditCardRepository.class, "findByIssuerAndCreditNetwork", methodType);

但似乎 MethodHandle 不起作用,因为我遇到以下错误:

java.lang.NoSuchMethodException: no such method: com.creditcard.dao.CreditCardRepository.findByIssuerAndCreditNetwork(String,String)ArrayList/invokeInterface

最佳答案

目前不支持创建动态查询。听起来有点像Query by Example可能是你要找的东西。 Spring Data MongoDB 和 Spring Data JPA 已经实现了 Query by Example。

查询由数据存储模块创建以匹配示例域对象:

Person person = new Person();                         
person.setFirstname("Dave");

Example<Person> example = Example.of(person);

MongoRepository repo = …
List<Person> result = repo.findAll(example); // returns all objects that with Dave in firstname

Spring Data Redis 目前不支持 Query by Example,但应该可以提供基本支持。

我创建了一张工单 DATAREDIS-605跟踪此功能的进度。

关于java - 如何使用 Spring Data Redis Repositories 构建动态查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42518900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com