2015-11-11 32 views
9

CrudRepository Yaylı önyükleme ile veriye erişen basit bir REST servisine sahibim.Spring boot CrudRepository ile filtreleme verileri

Bu depo zaten böyle sayfalama ve sıralama yetenekleri uygular

:

public interface FlightRepository extends CrudRepository<Flight, Long> { 
    List<Flight> findAll(Pageable pageable); 
} 

bunu çağrılması:

Sort sort = new Sort(direction, ordering); 
PageRequest page = new PageRequest(xoffset, xbase, sort); 

return flightRepo.findAll(page); 

Bu deposuna filtreleme da eklemek istiyorum (örneğin id > 13 AND id < 27 ile tek varlıkları dönmek). CrudRepository bu işlevselliği desteklemiyor gibi görünüyor. Bunu nasıl başarmanın bir yolu var mı yoksa farklı bir yaklaşım mı kullanmalıyım?

Teşekkürler!

cevap

7

Yukarıdaki parametrelerdeki her bir kombinasyon için sorgulama yöntemleri oluşturmaya ilişkin yorumlarınızdan endişe duyacağınız bir alternatif, Spriteria API'sı ya da Spriteria QueryDSL kullanarak. ve bu ikinci nokta - - sorguları tanımlamak sabit seti

çünkü büyük uygulamalar için büyümek olabilir sorgu yöntemlerinin sayısı:

Her iki yaklaşım aşağıda endişe yanıt olarak Şuna özetlenen kriterlerine sahiptir. Bu iki dezavantajı önlemek için, , sorgunuzu oluşturmak için 'u dinamik olarak birleştirebileceğiniz bir dizi atomik belirleyici ile karşılaşmanız harika olmaz mıydı?

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

Ben çalışmak için QueryDSL biraz daha kolay bulabilirsiniz. Sadece herhangi bir parametre kombinasyonunu bir yüklem olarak iletebileceğiniz tek bir arayüz metodu tanımlamanız gerekir.

örn.

public interface UserRepository extends PagingAndSortingRepository<User, Long>, QueryDslPredicateExecutor<User> { 
    public List<User> findAll(Predicate predicate); 
} 

ve sorgulamak için: QUser bir QueryDSL otomatik oluşturulan sınıfı olan

repository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.M))); 

repository.findAll(QUser.user.address.town.eq("Edinburgh")); 

repository.findAll(QUser.user.foreName.eq("Jim")); 

. Bahar Veri modülünün Gosling sürümünün yarattığı Güncelleme

http://docs.spring.io/spring-data/jpa/docs/current/api/index.html?org/springframework/data/jpa/repository/support/QueryDslRepositorySupport.html

http://www.querydsl.com/static/querydsl/2.1.0/reference/html/ch02s02.html

şimdi bir web uygulamasında HTTP parametrelerinden otomatik yüklem nesil için destek var.

https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support

0

Sonra deponun örneğinden bu işlevi çağırmak edebilirsiniz depo [EDITED]

Page<Flight> findByIdBetween(Long start, Long end, Pageable pageable) 

aşağıda işlevi bildirin. Daha fazla bilgi için lütfen spring-data reference'a başvurun.

+0

Bu, Pageable ile birleştirilebilir mi? Bunu bir nesnede belirtebileceğimi ve işleve iletebileceğimi umuyordum. Bu biraz esneklik istendiğinde çok kullanışlı değil (kullanıcı filtrelenecek özel alan belirtebilir ve her olası kombinasyon için böyle bir işlev belirtmek zorunda kalacağım). – Smajl

+0

evet, simpy ''List findByIdBetween (Uzun başlangıç) seçeneklerini kullanabilirsiniz. , Uzun süre, Pageable pageable) ' – pezetem

+0

ayrıca genişletilmiş arayüzü 'PagingAndSortingRepository' olarak değiştirmenizi tavsiye eder. –