স্প্রিং ডাটা: শেষ আইটেম লিস্টে সবার প্রথমে রাখা - স্প্রিং হাইবারনেট


অনেক সময় আমাদের আইটেমের লিস্টে আমরা সর্বশেষ ইনপুট দেয়া ডাটা সবার শুরুতে দেখতে চাই। এর অনেক প্রয়োজনও আছে। কারণ, সর্বশেষ যে ডাটা ইনপুট দিয়েছি, হয়তো সেটাই ব্যবহার করতে চাই, সেই ডাটায় ভুল হতে পারে, সেটা ঠিক করতে চাই ইত্যাদি।


বাস্তব উদাহরণ

ব্লগে যখন একটা পোস্ট লিখি, তখন সেটা কোন না সেকশনে যুক্ত করতে হয়। আমি চাই সর্বশেষ পোস্টটা যেন পোস্ট লিস্টে সবার উপরে থাকে, তাহলে আমার আলাদা করে সার্চ করে পোস্ট বের করা লাগে না।


স্প্রিং ডাটা সলিউশন

কোন একটা ফিল্ডের উপর ভিত্তি করে লিস্ট সাজাতে হবে। অনেক রকম বুদ্বি আছে। অনেকেই অটো জেনারেটেড আইডি দিয়ে, তার উপর ডিসেন্ডিং অর্ডার এপ্লাই করে। আমি সরাসরি ক্রিয়েটেড ডেট দিয়ে ডাটা সেভ করি এবং এই ফিল্ড দিয়ে ডিসেন্ডিং অর্ডারে লিস্ট করতে পছন্দ করি। প্রাইমারি আইডি হিসাবে UUID ব্যবহার করি। তাহলে আমার ব্লগের সুলিশন কেমন,


১. এন্টিটিতে একটা ক্রিয়েটেড ফিলড রাখা আছে, আসলে এটা অডিট এর পার্ট এবং আমার পোস্ট একে ইনহেরিট/এক্সটেন্ড করেছে

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseAuditEntity {

    @CreatedBy
    private String createdBy;

    @CreatedDate
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdAt;

    @LastModifiedBy
    private String updatedBy;

    @LastModifiedDate
    @Temporal(TemporalType.TIMESTAMP)
    private Date updatedAt;
}

২. খুব গুরুত্বপূর্ণ সার্ভিস লেয়ার কোড, যেখানে অর্ডার ঠিক করে দেয়া হয়েছে। ক্লায়েন্টে থেকে পাওয়া পেজের, পেজ নাম্বার ও আইটেম ঠিক রেখে সর্টিং অর্ডার পরিবর্তন করে দেয়া হয়েছে।


@Override
public Page<PostProjection> findAll(Pageable pageable, String query) {
    Pageable orderBylastItemFirst = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by(Sort.Direction.DESC, "createdAt"));
    return postRepository.findAll(orderBylastItemFirst, query);
}


ব্যাস, কাজ শেষ। এখন API কল করলে createdAt এর উপর ভিত্তি করে সবশেষ ডেট থেকে ডাটা দিবে। ধন্যবাদ