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

忽略空参数的Spring Data JPA命名查询

何甫
2023-03-14
@Repository
public interface EntityRepository extends JpaRepository<Entity, Long> {

    List<Entity> findAllByFirstId(Long firstId);
    List<Entity> findAllBySecondId(Long secondId);
    List<Entity> findAllByFirstIdAndSecondId(Long firstId, Long secondId);
}
ResponseEntity<List<Entity>> entities(Optional<Long> firstId, Optional<Long> secondId);
public List<Entity> entities(Optional<Long> firstId, Optional<Long> secondId) {

    return firstId
        .or(() -> secondId)
        .map(value -> {
            if (firstId.isEmpty()) {
                return entityRepository.findAllBySecondId(value);
            }
            if (secondId.isEmpty()) {
                return entityRepository.findAllByFirstId(value);
            }
            return entityRepository.findAllByFirstIdAndSecondId(
            firstId.get(), secondId.get());
        })
        .orElse(entityRepository.findAll())
        .stream()
        .map(...)     // Mapping between DTO and entity. For sake of brevity
                      // I used the same onject Entity for both controler and repository 
                      // as long as it not related to the question   

        .collect(Collectors.toList());
}

这个问题已经问过了:Spring data-ignore参数,如果它有一个空值和一个创建的票证,datajpa-209。

只要这个问题是近3年前的问题,而且票证可以追溯到2012年,我就想问是否有一种更舒适和通用的方法来避免处理可选的和复制存储库方法的开销。2个这样的参数的解决方案看起来是可以接受的,但是我想实现4-5个参数的非常相同的过滤。

共有1个答案

黄沈浪
2023-03-14

您需要这样的规范实用程序类

public class EntitySpecifications {
    public static Specification<Entity> firstIdEquals(Optional<Long> firstId) {// or Long firstId. It is better to avoid Optional method parameters.
        return (root, query, builder) -> 
            firstId.isPresent() ? // or firstId != null if you use Long method parameter
            builder.equal(root.get("firstId"), firstId.get()) :
            builder.conjunction(); // to ignore this clause
    }

    public static Specification<Entity> secondIdEquals(Optional<Long> secondId) {
        return (root, query, builder) -> 
            secondId.isPresent() ? 
            builder.equal(root.get("secondId"), secondId.get()) :
            builder.conjunction(); // to ignore this clause
    }
}

然后您的EntityRepository必须扩展JPaspecificationExecutor

@Repository
public interface EntityRepository 
    extends JpaRepository<Entity, Long>, JpaSpecificationExecutor<Entity> {

}

用法:

@Service
public class EntityService {    

    @Autowired
    EntityRepository repository;

    public List<Entity> getEntities(Optional<Long> firstId, Optional<Long> secondId) {
        Specification<Entity> spec = 
            Specifications.where(EntitySpecifications.firstIdEquals(firstId)) //Spring Data JPA 2.0: use Specification.where
                          .and(EntitySpecifications.secondIdEquals(secondId));

        return repository.findAll(spec);        
    }
}
 类似资料:
  • Spring Hateoas没有为以下请求映射创建适当的链接: 致电/会员/12345时,您希望返回: 但相反,它返回: 这是为什么?即使我使用@Request estParam,它也完全忽略了过滤器。在这件事上,任何建议都将受到赞赏。

  • 说我有下面的JPA方法: 用户通过输入字段和选择字段过滤这些对象的列表,从而调用此方法: 在这种情况下,如果用户不使用该字段进行搜索,则布尔值可以是true、false或null。看起来JPA实际上是在搜索一个空值,而我希望它忽略任何空值。我已经能够使用以下代码进行此组合搜索: 这是可行的,但显然,在一个有8个搜索选项的页面上,这将成为一场噩梦。字符串参数没有这个问题,因为当用户不选择过滤器时,它

  • 当我试图使用包含名称空间的JAXB将xml转换为Java对象时,会发生错误。 示例示例:' Zeta Walnes ` 我需要忽略名称空间

  • 问题内容: 什么是运行查询以便忽略字段中的空格的最佳方法?例如,以下查询: 将找到以下条目: 我正在使用php或python,但我认为这没有关系。 问题答案:

  • 在代码中我发现: 类雇员不是我们的类,可能从wsdl文件生成,其中参数(年龄和地点)被称为,,所以有人试图命名null参数以知道哪个是哪个,但这是好的做法吗?另一个问题是,和被翻译,而其他两个参数只是,但除此之外,创建带有值的变量只是为了将其传递到构造函数的下一行,可以吗?

  • 问题内容: 我正在寻找一种创建忽略空格的学说查询的方法。我尝试用replace,但是我一直都收到 预期的已知功能,得到“替换” 我的查询看起来像: 问题答案: 好的,我编写了一个替换DQL函数。 接下来在app / config.yml中,我添加: 最后,我在控制器中创建了一个DQL查询: 最有趣的是,“引号”非常重要。这意味着您可以在select,from,setParameter和orderB