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

时间:2016-04-26 08:08:08

标签: spring spring-data spring-data-jpa

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

List <Person> findByLastname(String lastname);

但是如果将来添加/删除某些参数怎么办?如何使用Spring Data JPA使一些参数可选,类似这样

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

5 个答案:

答案 0 :(得分:3)

使用querydsl framework解决了我的任务。如果您使用gradle,则需要在 build.gradle 中添加this

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();

答案 1 :(得分:2)

我认为这篇文章正是您所寻找的:

JPA Criteria API Queries

通过在查询中添加多个谓词,您可以根据输入获得动态条件。

此引用也可能有用Spring Data JPA Specifications

答案 2 :(得分:2)

使用按示例查询

Person person = new Person();                         
person.setLastname("Smith");                          
Example<Person> example = Example.of(person);
List<Person> results = personRepository.findAll(example);

文档http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example

这是Adam Erstelle对Spring Data JPA: Query by Example?

的回答

答案 3 :(得分:1)

你不能使用Spring Data的可选参数和命名方法解析器,你应该为每种可能性创建方法,为什么要让它更容易我建议你使用Specification你可以根据a建立一个查询条件清单。

如果你不确定你的参数是否会被修复,那么我会使用这个方法:

  1. 使用spring规范,您可以根据某些条件构建查询。 https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

  2. 创建一些JUinit测试以确保您的查询是稳定的,如果有人添加/删除某些参数,则应修改JUnit以使其保持更新。

  3. 如果您对如何使用有疑问请告诉我,我可以与您分享其他一些例子。

答案 4 :(得分:-1)

  

是的,但是,您需要进行不同的查询   根据给定的参数。

这就像:

@RequestMapping("find")
public List<Person> findByOptional...(@RequestParam(value = "fName", required = false) String fname,@RequestParam(value = "lName", required = false) String lname) {
    //here you need to check you data for not null and create methods accordingly 
}

*但这不是那么明智,如果你传递更多的可选参数,那么需要在if else条件下放更多。