স্প্রিং ডেটাতে ফাইন্ডএল সহ অর্ডারবাই কীভাবে ব্যবহার করবেন


288

আমি বসন্তের ডেটা ব্যবহার করছি এবং আমার ডিএওর মতো দেখাচ্ছে

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

উপরের কোডে, মন্তব্য করা লাইনটি আমার উদ্দেশ্য দেখায়। এএসসি / ডিইএসসি দিয়ে কোনও কলাম দ্বারা সমস্ত রেকর্ড অর্ডার সন্ধান করার জন্য স্প্রিং ডেটা এই জাতীয় পদ্ধতি ব্যবহারের জন্য ইনবিল্ট কার্যকারিতা সরবরাহ করে?

উত্তর:


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

উপরের কোডটি কাজ করা উচিত। আমি অনুরূপ কিছু ব্যবহার করছি:

public List<Pilot> findTop10ByOrderByLevelDesc();

এটি সর্বোচ্চ স্তরের সাথে 10 টি সারি দেয়।

গুরুত্বপূর্ণ: যেহেতু আমাকে বলা হয়েছে যে এই উত্তরের মূল পয়েন্টটি মিস করা সহজ, তাই এখানে একটু স্পষ্টতা দেওয়া হলো:

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

4
সঙ্গে স্প্রিং ডাটা JPA অভিপ্রেত হিসেবে কাজ করার জন্য আপনার পদ্ধতি স্বাক্ষরের জন্য, আপনি "সমস্ত" কীওয়ার্ডটি তাই মত অন্তর্ভুক্ত করা উচিত: List<StudentEntity> findAllByOrderByIdAsc();। একটি রিটার্ন টাইপ যুক্ত করা এবং অপ্রয়োজনীয় পাবলিক মডিফায়ার অপসারণ করাও একটি ভাল ধারণা;)
হ্যাভার্ড গিথাস

1
আমি সম্মত হই যে জনসাধারণ অপ্রয়োজনীয় তবে আপনার কোডে অন্য কেউ কাজ করার ক্ষেত্রে এটি বিষয়গুলি পরিষ্কার রাখে। কে হবেন তা আপনি কখনই জানেন না: পিআই লেখক কোডে পদ্ধতির নাম ছাড়া অন্য কিছু পরিবর্তন করেন নি কারণ সমস্যাটি কোথায় তা নয় এবং যদি কেউ জানেন না তবে সেখানে কী থাকতে হবে, আশা করি তারা নতুন কিছু শিখবেন। তদ্ব্যতীত, এটি নীচে আমার উদাহরণে রয়েছে তাই তাদের কোথায় knowsশ্বর জানেন যে সন্ধান করতে হবে না, তবে আপনি যদি জেদ করেন, তবে তাই হোন :) যুক্ত 'সমস্ত' কীওয়ার্ড। ধন্যবাদ।
সিকোর

73
নোট Byকরুন OrderByকীওয়ার্ডের সামান্য আগে সমস্ত পার্থক্য তৈরি করে।
স্টিফান হ্যাবারেল

5
Byসামনে কেন অতিরিক্ত যুক্ত করা দরকার তা এখনও বুঝতে পারছি না OrderByডকুমেন্টেশন এটি সম্পর্কে আমাদের বলুন না
এক্সট্রিম বাইকার

3
@ এক্সট্রিমবিকার আপনি যে ডকুমেন্টেশন লিঙ্কটি দিয়েছিলেন তা থেকে: "তবে, প্রথম দ্বারা প্রকৃত মানদণ্ডের সূচনা নির্দেশ করার জন্য সীমানা হিসাবে কাজ করে।" তদতিরিক্ত, যদি আপনি "3.4.5 বিভাগে স্ক্রোল করে থাকেন query কোয়েরি ফলাফলগুলি সীমাবদ্ধ করছেন", আসলে এর মতো উদাহরণ রয়েছে তবে এটি ব্যাখ্যা করা হয়নি।
সিকোর

54

আফাইক, আমি মনে করি না প্রত্যক্ষ পদ্ধতিতে নামকরণের ক্যোয়ারির মাধ্যমে এটি সম্ভব is 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");
    }
} 

নিচে সিকোরের উত্তরে উল্লিখিত অলবায়র্ডারবিআইডএএসসি () ব্যবহার করে এটি সম্ভবত সম্ভব ... ... প্রশান্ত যে সত্যই সঠিক উত্তর হওয়া উচিত
স্যামুয়েল পার্সোনেজ

আপনি যদি আপনার ভাণ্ডারগুলিকে কম বিশৃঙ্খলা রাখতে চান তবে পরিষেবা স্তরতে বাছাইয়ের বিকল্প উপায়। ফলাফলের আকারটি মনে রাখবেন!
dkanejs

2
এই findAll()ধরণের পদ্ধতিটি CrudRepository<>আর্গুমেন্টগুলির জন্য প্রযোজ্য নয় (সাজান)
থিয়াগো পেরেইরা

5
আপনি JpaRepository<>যদি উপরের উদাহরণটি ব্যবহার করতে চান তবে @ থিয়াগোপিরির আপনার প্রসারিত হওয়া উচিত ।
ওয়ালিদ আবদালমাজিদ

15

দয়া করে একটি চেহারা আছে রেফারেন্স ডকুমেন্টেশন, বিভাগ 5.3 - স্প্রিং ডাটা JPA। অনুসন্ধান পদ্ধতি , বিশেষত বিভাগে 5.3.2। ক্যোয়ারী ক্রিয়েশন , " টেবিল ৩. পদ্ধতির নামের অভ্যন্তর সমর্থিত কীওয়ার্ডগুলিতে " (2019-05-03 হিসাবে লিঙ্কগুলি)।

আমি মনে করি এটির যা আপনার প্রয়োজন ঠিক তেমনই রয়েছে এবং একই প্রশ্নের সাথে আপনার বক্তব্য যেমন কাজ করা উচিত ...


1
আপনার লিঙ্কটি কাজ করে না -> আমি ধরে নিই যে আপনি এই লিঙ্কটির দিকে নির্দেশ করতে চেয়েছিলেন: ডকস.স্প্রিং.আইভি
ফিশার


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

উপরের সমস্ত উত্তর একত্রিত করে, আপনি বেসএন্টিটির সাথে পুনরায় ব্যবহারযোগ্য কোডটি লিখতে পারেন:

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

}

StudentEntityBaseEntityপুনরাবৃত্তিযোগ্য ক্ষেত্রগুলি রয়েছে এমন প্রসারিত হয় (সম্ভবত আপনি আইডির মাধ্যমেও বাছাই করতে চান)

@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);
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.