2014-12-23 20 views
19

Yay Verilerini Kullanma JPA, belirli bir varlık örneğinin arama ölçütü olarak kullanıldığı bir query by example yapabilir miyim?Yay Verisi JPA: Örnekle Sorgulama?

Örneğin

(hayır cinas tasarlamak), ben şöyle bir Person varlık varsa:

@Entity 
public class Person { 
    private String firstName; 
    private String lastName; 
    private boolean employed; 
    private LocalDate dob; 
    ... 
} 

Ben bir örnekle 1 Ocak 1977 doğumlu Smith bir soyadı ile bütün kişileri bulabiliriz :

Person example = new Person(); 
example.setEmployed(true); 
example.setLastName("Smith"); 
example.setDob(LocalDate.of(1977, Month.JANUARY, 1)); 
List<Person> foundPersons = personRepository.findByExample(example); 
+0

Sorularınız belli değil bakın gerektirdiğini http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example

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

Not göz atın. Tam olarak ne arıyorsun? –

+2

Hayır, hazırda bekletme ile sınırlı değilsiniz, Spring Data, JPA için tasarlanmıştır. Her zaman bir "Şartname" oluşturabilir ve daha sonra benzer bir şey yapmak için kullanabileceğinizi uygulayabilirsiniz. –

cevap

7

Bahar veri JPA ve EntityManager üstüne dayanır, Hibernate ve Oturum ve bu gibi kutudan çıktığı findByExample yok değil. Sen bahar veri otomatik sorgu oluşturma kullanır ve aşağıdaki imzası ile depoda bir yöntem yazabilirsiniz:

List<Person> findByEmployedAndLastNameAndDob(boolean employed, String lastName, LocalDate dob); 
+0

JPA! = Hazırda Bekletme. Mantıklı. @M tarafından belirtildiği gibi 'Spesiasyon 'rotasını gitmeyi düşünüyorum. Deinum, daha fazla ad hoc sorgu yapabilmek için buraya gitmenin yoludur. –

+1

Buradaki örneklere http://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/ bakabilirsiniz. İhtiyaçlarınıza hizmet edebilir –

+0

İlkbahar Veri JPA'sında bu özelliği talep etmek için [DATAJPA-844] (https://jira.spring.io/browse/DATAJPA-844) adresini açtım. Yol haritalarında olduğu gibi görünüyor! –

19

Ben örnek sorgu kullanımını yaklaşmak başardı Bahar verinin Specification arayüzünü kullanarak. İşte Specification uygular ve kurulum tarafından döndürülen Predicate üzere bir "örnek" kişiyi gerektiren bir PersonSpec sınıf var Specification:

public class PersonSpec implements Specification<Person> { 

    private final Person example; 

    public PersonSpec(Person example) { 
    this.example = example; 
    } 

    @Override 
    public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq, CriteriaBuilder cb) { 
    List<Predicate> predicates = new ArrayList<>(); 

    if (StringUtils.isNotBlank(example.getLastName())) { 
     predicates.add(cb.like(cb.lower(root.get(Person_.lastName)), example.getLastName().toLowerCase() + "%")); 
    } 

    if (StringUtils.isNotBlank(example.getFirstName())) { 
     predicates.add(cb.like(cb.lower(root.get(Person_.firstName)), example.getFirstName().toLowerCase() + "%")); 
    } 

    if (example.getEmployed() != null) { 
     predicates.add(cb.equal(root.get(Person_.employed), example.getEmployed())); 
    } 

    if (example.getDob() != null) { 
     predicates.add(cb.equal(root.get(Person_.dob), example.getDob())); 
    } 

    return andTogether(predicates, cb); 
    } 

    private Predicate andTogether(List<Predicate> predicates, CriteriaBuilder cb) { 
    return cb.and(predicates.toArray(new Predicate[0])); 
    } 
} 

depo basitçe:

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 

public interface PersonRepository extends JpaRepository<Person, Long>, JpaSpecificationExecutor {} 

Kullanım örneği:

Person example = new Person(); 
example.setLastName("James"); 
example.setEmployed(true); 
PersonSpec personSpec = new PersonSpec(example); 
List<Person> persons = personRepository.findAll(personSpec); 
+0

İyi ama yine de yazmak istediğim her Sorgu için bir uygulama sınıfı oluşturmam gerekiyor. –

+1

Person_ nereden geliyor? –

+0

Person_ Statik bir metamodel sınıfıdır – fyrite

36

Bu, Bahar Verileri ile artık mümkün. Bu çok yeni 2016 sürümlerini

<dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-jpa</artifactId> 
     <version>1.10.1.RELEASE</version>  
    </dependency> 
    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-commons</artifactId> 
     <version>1.12.1.RELEASE</version> 
    </dependency> 

https://github.com/paulvi/com.example.spring.findbyexample

+0

wow, hot! Cevap bir günde 5 oy aldı –

+0

Daha karmaşık bir domain hakkında ne var. Dernek olduktan sonra örneği nasıl kullanabilirim? Herhangi bir fikir ? –

+1

Daha karmaşık bir etki alanı için, Spring Data JPA ile QueryDSL kullanarak bitti. Kafamı öğrenmek ve etrafımı sarmak için biraz aldım, ama aslında kod tabanımızı yeniden düzenledik ve Örnek kullanımını tamamen ortadan kaldırdık. –

İlgili konular