具有不同参数的 Spring data JPA 查询

标签 spring spring-data spring-data-jpa

我试图通过几个参数找到表格中必要的元素,例如

List <Person> findByLastname(String lastname);

但是如果将来添加/删除其中一些参数怎么办?如何使用 Spring Data JPA 使某些参数可选,如下所示

List <Person> findByOptionalLastnameAndOptionalFirstNameAnd...(String lastname, String firstname,...);

最佳答案

我的任务是通过使用 querydsl framework 解决的。如果使用gradle,则需要添加thisbuild.gradle中:

dependencies {
  compile "com.mysema.querydsl:querydsl-jpa:3.6.3"

  compile "com.mysema.querydsl:querydsl-apt:3.6.3:jpa" // Magic happens here

  compile "org.hibernate:hibernate-entitymanager:4.3.5.Final"

  compile 'com.h2database:h2:1.4.187'
}

也可以使用 JPA Criteria API,很好的例子是 here很好的教程是 here .

@Entity
public class A {
    @Id private Long id;    
    String someAttribute;
    String someOtherAttribute;
    ...
}

查询本身:

//some parameters to your method
    String param1 = "1";
    String paramNull = null;

    CriteriaBuilder qb = em.getCriteriaBuilder();
    CriteriaQuery cq = qb.createQuery();
    Root<A> customer = cq.from(A.class);

    //Constructing list of parameters
    List<Predicate> predicates = new ArrayList<Predicate>();

    //Adding predicates in case of parameter not being null
    if (param1 != null) {
        predicates.add(
                qb.equal(customer.get("someAttribute"), param1));
    }
    if (paramNull != null) {
        predicates.add(
                qb.equal(customer.get("someOtherAttribute"), paramNull));
    }
    //query itself
    cq.select(customer)
            .where(predicates.toArray(new Predicate[]{}));
    //execute query and do something with result
    em.createQuery(cq).getResultList();

关于具有不同参数的 Spring data JPA 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36858956/

相关文章:

java - Spring Boot使用pathvariable从url获取id

java - 分隔多个登录 Web 用户之间的变量值

java - Spring数据聚合查询elasticsearch

spring-boot - 如何使用 JPA 计算列的平均值?

java - Hibernate 有时不提取 uuid 引用的实体

java - 当我们在 Spring Boot 中使用 JPA Repository 时,List<Object> 默认大小是多少?

java - Spring MVC - 从JSP表中删除记录

java - 存储库RestExceptionHandler : object is not a managed entity

java - Spring Data Repository JPA 实体继承问题 : Cannot instantiate abstract class or interface

java - Freemarker 以错误的方式转换负整数