带有查询 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 的可选参数的主要内容,如果未能解决你的问题,请参考以下文章
关于如何使用 jpa-repositiroies 在 Spring-Boot 上持久保存数据的指南/教程
如何禁用嵌入式数据库 Spring-boot spring-data-jpa
Spring-boot JPA 连接到 postgres,其中在运行时提供数据库和模式