当前位置: 首页 > 知识库问答 >
问题:

如何用Spring Data Redis存储库构建动态查询?

凤财
2023-03-14
public interface CreditCardRepository extends CrudRepository<CreditCard, String>{
    List<CreditCard> findByIssuer(String issuer);
    List<CreditCard> findByCreditNetwork(String creditNetwork);
    List<CreditCard> findByCreditNetworkAndIssuer(String creditNetwork, String issuer);
}
creditcard:creditNetwork:mastercard
creditcard:creditNetwork:visa
creditcard:issuer:company1
creditcard:issuer:company2

现在,我的CreditCard对象包含两个属性(发行商、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个财产,所以‘如果’链是不可能的。

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

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

共有1个答案

公良同
2023-03-14

目前,还不支持创建动态查询。听起来有点像通过示例查询可能是您正在寻找的东西。Spring Data MongoDB和Spring Data JPA已经通过示例实现了查询。

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

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目前不支持示例查询,但应该可以提供基本支持。

 类似资料:
  • 目前我一直在使用以下Spring JPA存储库自定义查询, 我需要修改这个查询时,筛选文本将是逗号分隔的值。但按照以下方式,它将是一个动态查询,我如何执行它。 我需要构建动态查询,

  • 问题内容: 我正在使用PDO,并希望执行以下操作: PDO是否允许我这样绑定表名和列名?这 似乎是 允许的,但是却让我周围的报价参数,即使我用PDO :: PARAM_INT或PDO :: PARAM_BOOL作为数据类型。 如果这不起作用,如何安全地对变量进行转义,以便可以在查询中对它们进行插值? 问题答案: 不幸的是,您不能按列名绑定参数。 您可以尝试动态创建SQL命令: 只要确保对参数/变量

  • 如何在一个类中创建和实例化jpa存储库?我现在的情况是,我必须在一个泛型类中为不同的实体创建存储库。 我可以很容易地为Neo4j存储库这样做, 对于JpaRepostory,我检查了留档,发现了这个, 我不确定如何在上面的代码中实例化工厂。 另外,我不能像为Neo4j那样通过指定域类来创建存储库吗?

  • 如何使用@ Query(value = " SELECT * FROM do _ not _ track WHERE(user _ id = 7)AND(' 2022-06-25 ' BETWEEN FROM _ date AND to _ date)OR(' 2022-06-30 ' BETWEEN FROM _ date AND to _ date)",nativeQuery = true)在

  • 我们目前没有自己的存储库。因此,当我们使用maven构建时,它将在当前用户的主目录中创建.m2存储库。 现在有两个第三方JAR在Maven Central中找不到。假设其中之一是hasp-srm-api.jar。今天的过程是这样的: a.依赖于hasp-srm-api.jar的项目的pom.xml包含以下行: b.在进行第一次构建之前,我们执行以下命令: 我的问题是这样的--这一步有没有可能自动化

  • 问题内容: 如何在类内创建和实例化jpa存储库?我处于一种情况,必须为通用类中的不同实体创建存储库。 对于Neo4j存储库,我可以轻松地做到这一点,例如, 对于JpaRepository,我检查了文档并发现了这一点, 我不确定如何在以上代码中实例化工厂。 还不能通过指定域类来像创建Neo4j一样创建存储库吗? 问题答案: 我终于以这种方式工作了, 通过SimpleJpaRepository,我可以