Spring Data JPA:生成动态查询

时间:2018-09-16 12:51:00

标签: java spring spring-boot spring-data-jpa spring-data

我有一个保存一些逻辑数据的实体:

@Entity
public class Person {
  private Long id.
  private String name;
  private int age;
  private String address;
  ...
}

我创建我的Spring数据接口

@Repository
public interface CardInventoryRepository extends JpaRepository<Person , Long> {
}

例如,我的目的是基于实体的存在值创建动态查询。 如果名称为null,则查询为:

select * from Person p  Where p.age=12 AND p.address="adress.."

当地址为空时,查询应为:

select * from Person p  Where p.age=12 AND p.name="ALI"

我只想使用非空字段提取数据?

有什么解决方案可以使用spring数据来构建动态查询? 预先感谢

2 个答案:

答案 0 :(得分:2)

是的,请看一下Spring Data的QueryDSL支持。您的用例可以通过谓词实现。简而言之,您必须创建一个谓词,在该谓词中您将传递非null字段,然后将该谓词传递给以谓词为参数的findAll方法。您的存储库界面还必须扩展QueryDslPredicateExecutor

答案 1 :(得分:2)

基于Spring文档https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example

  

示例查询(QBE)是一种用户友好的查询技术,具有   简单的界面。它允许动态查询创建,但不允许   要求您编写包含字段名称的查询。实际上,查询   通过示例不需要您使用编写查询   商店专用的查询语言。

定义: Example接受一个数据对象(通常是实体对象或它的子类型)和一个说明如何匹配属性的规范。您可以在JPA中使用“按示例查询” 存储库。

为此,请让您的存储库界面扩展QueryByExampleExecutor<T>,例如:

public interface PersonRepository extends CrudRepository<Person, String>, QueryByExampleExecutor<Person> {
}

这是QueryByExampleExecutor中可用的方法:

public interface QueryByExampleExecutor<T> {

  <S extends T> S findOne(Example<S> example);

  <S extends T> Iterable<S> findAll(Example<S> example);

  // … more functionality omitted.
}

用法:

Example<Person> example = Example.of(new Person("Jon", "Snow"));
repo.findAll(example);


ExampleMatcher matcher = ExampleMatcher.matching().
    .withMatcher("firstname", endsWith())
    .withMatcher("lastname", startsWith().ignoreCase());

Example<Person> example = Example.of(new Person("Jon", "Snow"), matcher); 
repo.count(example);

更多信息