वसंत डेटा में findAll के साथ ऑर्डरबी का उपयोग कैसे करें


288

मैं स्प्रिंग डेटा का उपयोग कर रहा हूं और मेरा DAO जैसा दिखता है

public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllOrderByIdAsc();   // I want to use some thing like this
}

उपरोक्त कोड में, टिप्पणी की गई पंक्ति मेरा इरादा दिखाती है। क्या स्प्रिंग डेटा ASC / DESC के साथ कुछ कॉलम द्वारा सभी रिकॉर्ड क्रम को खोजने के लिए इस तरह की विधि का उपयोग करने के लिए इनबिल्ट कार्यक्षमता प्रदान करता है?

जवाबों:


657
public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public List<StudentEntity> findAllByOrderByIdAsc();
}

उपरोक्त कोड काम करना चाहिए। मैं कुछ इसी तरह का उपयोग कर रहा हूँ:

public List<Pilot> findTop10ByOrderByLevelDesc();

यह उच्चतम स्तर के साथ 10 पंक्तियों को लौटाता है।

महत्वपूर्ण: जब से मुझे बताया गया है कि इस उत्तर के प्रमुख बिंदु को याद करना आसान है, यहाँ थोड़ा स्पष्टीकरण है:

findAllByOrderByIdAsc(); // don't miss "by"
       ^

4
स्प्रिंग डेटा जेपीए के साथ काम करने के लिए आपके विधि हस्ताक्षर के लिए, आपको "सभी" कीवर्ड को शामिल करना चाहिए, जैसे List<StudentEntity> findAllByOrderByIdAsc();:। वापसी प्रकार जोड़ना और निरर्थक सार्वजनिक संशोधक को हटाना भी एक अच्छा विचार है;)
होवर गेथस

1
मैं मानता हूं कि जनता बेमानी है, लेकिन अगर आपके कोड पर किसी और को काम करना है तो यह चीजों को स्पष्ट रखता है। आप कभी नहीं जानते कि यह कौन होगा: PI ने लेखक कोड में विधि नाम के अलावा और कुछ नहीं बदला क्योंकि यह वह जगह नहीं है जहां समस्या थी और अगर कोई नहीं जानता कि क्या होना चाहिए, तो उम्मीद है कि वे कुछ नया सीखेंगे। इसके अलावा, यह मेरे उदाहरण के नीचे है, इसलिए उन्हें यह नहीं पता होगा कि भगवान को पता है कि कहां है, लेकिन यदि आप जोर देते हैं, तो ऐसा हो :) यह सभी कीवर्ड जोड़ा गया। धन्यवाद।
सीकर

73
ध्यान दें कि कीवर्ड Byसे पहले थोड़ा OrderByफर्क पड़ता है।
स्टीफन हैबरल

5
फिर भी समझ में नहीं आता है कि Byसामने एक अतिरिक्त जोड़ना क्यों आवश्यक है OrderByप्रलेखन इसके बारे में नहीं बताता है
Xtreme बाइकर

3
@XtremeBiker आपके द्वारा प्रदान किए गए दस्तावेज़ीकरण लिंक से: "हालाँकि, वास्तविक मानदंड की शुरुआत का संकेत देने के लिए सबसे पहले परिसीमन के रूप में कार्य करता है।" इसके अलावा, यदि आप "3.4.5 तक सीमित करते हैं, तो क्वेरी परिणामों को सीमित करना", वास्तव में इस तरह का एक उदाहरण है, लेकिन इसे समझाया नहीं गया है।
सिकर

54

AFAIK, मुझे नहीं लगता कि यह एक प्रत्यक्ष विधि नामकरण क्वेरी के साथ संभव है। हालाँकि आप Sortवर्ग का उपयोग करते हुए निर्मित छँटाई तंत्र का उपयोग कर सकते हैं । रिपॉजिटरी में एक findAll(Sort)विधि है जिसे आप एक उदाहरण दे सकते हैं Sort। उदाहरण के लिए:

import org.springframework.data.domain.Sort;

@Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(sortByIdAsc());
    }

    private Sort sortByIdAsc() {
        return new Sort(Sort.Direction.ASC, "id");
    }
} 

यह वास्तव में findAllByOrderByIdAsc () का उपयोग करके संभव है जैसा कि नीचे दिए गए सिकोर के उत्तर में बताया गया है ... @Prashant जो वास्तव में सही उत्तर होना चाहिए
सैमुअल पार्सोनेज

यदि आप अपने रिपॉजिटरी को कम अव्यवस्थित रखना चाहते हैं, तो सेवा स्तरीय में सॉर्ट करने का वैकल्पिक तरीका। हालांकि परिणाम आकार को ध्यान में रखें!
dkanejs

2
इस findAll()प्रकार CrudRepository<>का तरीका तर्कों (सॉर्ट) के लिए लागू नहीं है
थियागो परेरा

5
JpaRepository<>यदि आप उपरोक्त उदाहरण का उपयोग करना चाहते हैं तो @ThiagoPereira का विस्तार करना चाहिए ।
वलीद अब्दालमाजिद

15

कृपया स्प्रिंग डेटा JPA पर एक नज़र डालें - संदर्भ दस्तावेज़ीकरण, खंड 5.3। क्वेरी तरीके , विशेष रूप से खंड 5.3.2 पर। क्वेरी निर्माण , " तालिका 3 में। विधि नामों के अंदर समर्थित कीवर्ड " (2019-05-03 के लिंक)।

मुझे लगता है कि यह वही है जिसकी आपको आवश्यकता है और जैसा आपने कहा है वैसा ही काम करना चाहिए ...


1
आपका लिंक काम नहीं करता है -> मुझे लगता है कि आप इस लिंक की ओर इशारा करना चाहते थे: docs.spring.io/spring-data/jpa/docs/current/reference/html/…
Jørgen Skånis Sischer


3

हाँ, आप स्प्रिंग डेटा में क्वेरी विधि का उपयोग कर सकते हैं।

पूर्व: आईडी क्षेत्र के मूल्य का उपयोग करके आरोही क्रम या अवरोही क्रम।

कोड:

  public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllByOrderByIdAsc();   
}

दूसरा तरीका:

    @Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(orderByIdAsc());
    }
private Sort orderByIdAsc() {
    return new Sort(Sort.Direction.ASC, "id")
                .and(new Sort(Sort.Direction.ASC, "name"));
}
}

स्प्रिंग डेटा सॉर्टिंग: सॉर्टिंग


3

मैं इस उदाहरण में कोशिश करता हूं कि आप अपने ऑर्डरबी प्रकार को निजीकृत करने के लिए एक पूर्ण उदाहरण दिखाएं

 import java.util.List;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.*;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.data.domain.Sort;
 /**
 * Spring Data  repository for the User entity.
 */
 @SuppressWarnings("unused")
 @Repository
 public interface UserRepository extends JpaRepository<User, Long> {
 List <User> findAllWithCustomOrderBy(Sort sort);
 }

आप इस उदाहरण का उपयोग करेंगे: गतिशील रूप से ऑब्जेक्ट बनाने के लिए एक विधि जो सॉर्ट का उदाहरण है:

import org.springframework.data.domain.Sort;
public class SampleOrderBySpring{
 Sort dynamicOrderBySort = createSort();
     public static void main( String[] args )
     {
       System.out.println("default sort \"firstName\",\"name\",\"age\",\"size\" ");
       Sort defaultSort = createStaticSort();
       System.out.println(userRepository.findAllWithCustomOrderBy(defaultSort ));


       String[] orderBySortedArray = {"name", "firstName"};
       System.out.println("default sort ,\"name\",\"firstName\" ");
       Sort dynamicSort = createDynamicSort(orderBySortedArray );
       System.out.println(userRepository.findAllWithCustomOrderBy(dynamicSort ));
      }
      public Sort createDynamicSort(String[] arrayOrdre) {
        return  Sort.by(arrayOrdre);
        }

   public Sort createStaticSort() {
        String[] arrayOrdre  ={"firstName","name","age","size");
        return  Sort.by(arrayOrdre);
        }
}

0

उपरोक्त सभी उत्तरों को मिलाकर, आप BaseEntity के साथ पुन: प्रयोज्य कोड लिख सकते हैं:

@Data
@NoArgsConstructor
@MappedSuperclass
public abstract class BaseEntity {

  @Transient
  public static final Sort SORT_BY_CREATED_AT_DESC = 
                        Sort.by(Sort.Direction.DESC, "createdAt");

  @Id
  private Long id;
  private LocalDateTime createdAt;
  private LocalDateTime updatedAt;

  @PrePersist
  void prePersist() {
    this.createdAt = LocalDateTime.now();
  }

  @PreUpdate
  void preUpdate() {
    this.updatedAt = LocalDateTime.now();
  }
}

डीएओ ऑब्जेक्ट ओवरलोड को ढूंढता है। सभी विधि - मूल रूप से, अभी भी उपयोग करता है findAll()

public interface StudentDAO extends CrudRepository<StudentEntity, Long> {

  Iterable<StudentEntity> findAll(Sort sort);

}

StudentEntityऐसे विस्तार BaseEntityहोते हैं जिनमें दोहराए जाने योग्य फ़ील्ड होते हैं (हो सकता है कि आप आईडी द्वारा छांटना चाहते हों, साथ ही)

@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
class StudentEntity extends BaseEntity {

  String firstName;
  String surname;

}

अंत में, जिस सेवा और उपयोग का उपयोग SORT_BY_CREATED_AT_DESCसंभवत: न केवल अंदर किया जाएगा StudentService

@Service
class StudentService {

  @Autowired
  StudentDAO studentDao;

  Iterable<StudentEntity> findStudents() {
    return this.studentDao.findAll(SORT_BY_CREATED_AT_DESC);
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.