gpt4 book ai didi

java - spring-data-mongodb 拦截查询并注入(inject)谓词或规范

转载 作者:可可西里 更新时间:2023-11-01 09:06:22 25 4
gpt4 key购买 nike

环境:

spring-data-mongo: 1.7.0.RC1mongo-java-驱动程序:3.2.2

文档:

@Document(collection = "products")
public class Product {

@Id
private String sid;

private String name;

private Long vendor;

(...)
}

存储库:

public interface ProductRepository extends MongoRepository<Product, String> {

Product findByName(String productName);

}

我的目标是拦截对 Product 集合执行的任何查询并添加谓词或规范,而无需修改存储库或无需实现方法 findByNameAndBelongsToVendorList。

我需要这个拦截器或 aspectJ,因为我有多种方法,例如:

Page<Product> findAll(Pageable page);

List<Product> findByCategory(String category, Pageable pageRequest);

(...)

目标

findByName // perform a filter by name (explicit) 
// and a filter by vendor (injected via inteceptor or aspecJ)

避免这样做

@Repository
public class ProductRepositoryCustomImpl implements ProductRepositoryCustom {

@Autowired
private MongoTemplate template;

public Product findByNameAndBelongsToVendorList(String name, List<Long> vendors, Pageable pageRequest) {

Criteria criteriaVendor = Criteria.where("vendors").in(vendors);
Query query = new Query(criteriaVendor);
query.with(pageRequest);

return template.findOne(query, Product.class);
}
}

最佳答案

方面应该可以解决问题。

@Aspect
public class YourAspect {

@Autowired
private MongoTemplate template;

@Pointcut("execution(public * findByName(..))")
private void findByName() {
}

@Pointcut("within(com.leonel.repository.ProductRepository)")
private void repository() {
}

@Around("repository() && findByName()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
Object[] args = pjp.getArgs();
String name = (String) args[0];

Criteria newCriteria = YOUR NEW LOGIC HERE;
Query query = new Query(newCriteria);

return template.find(query, Your.class);
}

不过,我不建议这样做,因为它会给您的代码带来一些魔力,并且操作查询不应该是方面的问题。您希望避免在存储库中使用多个查找 方法的原因是什么?

关于java - spring-data-mongodb 拦截查询并注入(inject)谓词或规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37396654/

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