带有查询 Spring-Boot jpa 1.5 的可选参数

Posted

技术标签:

【中文标题】带有查询 Spring-Boot jpa 1.5 的可选参数【英文标题】:Optional param with query Spring-Boot jpa 1.5 【发布时间】:2019-04-22 07:05:03 【问题描述】:

我想使用 spring boot 1.5 对过滤器列表执行查询,我有参数(用户名)和可选参数(电子邮件),如何在查询中为参数分配可选参数? @Query("SELECT u FROM User u WHERE u.username LIKE :username AND u.email=:email") public Page getUsers(@Param("username") String username, @Param("email") String email); http://localhost:8080/users?username=&email=test:工作正常 http://localhost:8080/users?username=:例外

【问题讨论】:

创建两个方法,并根据电子邮件的存在情况调用其中一个。 我确实有很多过滤参数,但对于这个问题,我只需要两个参数,如何使用必需和可选参数执行查询? 使用 JPA 标准 API 动态创建查询,或 QueryDSL。 【参考方案1】:

像这样使用 JPA 标准 API:

首先,创建一个Specification对象:

private Specification<Item> createSpecification(ItemSearch itemSearch) 
    return (root, query, criteriaBuilder) -> criteriaBuilder.and(
            Stream.of(
                    itemSearch.getUsername() == null ? null : criteriaBuilder.like(root.get("username"), itemSearch.getUsername()),
                    itemSearch.getEmail() == null ? null : criteriaBuilder.equal(root.get("email"), itemSearch.getEmail())
            ).filter(Objects::nonNull).toArray(Predicate[]::new)
    );

JpaSpecificationExecutor 扩展您的存储库:

public interface ItemRepository extends CrudRepository<Item, Long>, JpaSpecificationExecutor<Item> 


使用规范选择所有项目:

List<Item> items = itemRepository.findAll(createSpecification(itemSearch))

【讨论】:

以上是关于带有查询 Spring-Boot jpa 1.5 的可选参数的主要内容,如果未能解决你的问题,请参考以下文章

java 带有Spring Boot 1.5的JPA

关于如何使用 jpa-repositiroies 在 Spring-Boot 上持久保存数据的指南/教程

如何禁用嵌入式数据库 Spring-boot spring-data-jpa

Spring-boot JPA 连接到 postgres,其中在运行时提供数据库和模式

带有 JPA 的 Spring Boot:将 @Entity 移动到不同的包

将现有的 Spring 应用程序转换为 Spring-Boot