স্প্রিং ডেটা: "মুছে ফেলা" সমর্থিত?


104

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

স্প্রিং জেপিএ কি ডিলিটবাইমন-মত মোছা সমর্থন করে? যে কোনও পয়েন্টার প্রশংসা করা হয়।

শুভেচ্ছা এবং ধন্যবাদ।

উত্তর:


190

অবমানিত উত্তর (স্প্রিং ডেটা জেপিএ <= 1.6.x) :

@Modifyingউদ্ধার টিকা। আপনাকে যদিও আপনার কাস্টম এসকিউএল আচরণ সরবরাহ করতে হবে।

public interface UserRepository extends JpaRepository<User, Long> {
    @Modifying
    @Query("delete from User u where u.firstName = ?1")
    void deleteUsersByFirstName(String firstName);
}

হালনাগাদ:

স্প্রিং ডাটা JPA (> = 1.7.x) জন্য কোয়েরি শিক্ষাদীক্ষা আধুনিক সংস্করণে delete, removeএবং countঅপারেশন প্রবেশযোগ্য।

public interface UserRepository extends CrudRepository<User, Long> {

    Long countByFirstName(String firstName);

    Long deleteByFirstName(String firstName);

    List<User> removeByFirstName(String firstName);

}

4
@ আন্ড্রেআটাপিন ডাউনভোট যেহেতু এটি আর ভাল উত্তর নেই। মুছে ফেলতে পারে? স্ট্যাকওভারফ্লোগুলির ত্রুটিগুলির মধ্যে একটি হ'ল সংস্করণ পরিবর্তনগুলি / প্রশ্নের সাথে সম্পর্কিত লাইব্রেরির সাথে যুক্ত বাগফিক্সগুলি পরিচালনা করা।
বেন জর্জ

4
@ ওয়েবেজিেক, আমি এই সমস্যাটি সমাধান করে দিতাম DELETE FROM x WHERE id = ?1 or parent_id = ?1। বিটিডব্লিউ, নিশ্চিত হয়ে নিন যে আপনার কোনও প্রকার না রয়েছে parent__id(অভিপ্রায় অনুসারে আপনার কি দ্বিগুণ কম ড্যাশ আছে?) আপনি কেন দেশীয় ক্যোয়ারী বিকল্পটি ব্যবহার করেন?
আন্দ্রে আটাপিন

4
এমনকি আমি ১..4.৪ ব্যবহার করি, @ সফল মুছে ফেলার জন্য ক্যোয়ারী পদ্ধতির উপরে ট্রানজেকশনাল টীকাগুলি প্রয়োজন
গোখানসারি

40
সাধারণত, একটি অ্যাপ্লিকেশনটিতে আপনার কাছে @ সার্ভিস ক্লাস / পদ্ধতি থাকবে এবং সেগুলি সংগ্রহস্থলগুলিতে কল করবে। এবং @ পরিষেবা সর্বজনীন পদ্ধতিগুলিতে @ ট্রানজেকশনাল হিসাবে চিহ্নিত পদ্ধতিগুলি হওয়া উচিত কারণ লেনদেনগুলি ইউজ কেস ভিত্তিক হয়। অর্থ একটি ব্যবহারের ক্ষেত্রে পুরোপুরি প্রতিশ্রুতিবদ্ধ বা রোলব্যাক করা দরকার। প্রতিটি স্বতন্ত্র সংগ্রহ পদ্ধতি নয়। সুতরাং দয়া করে সংগ্রহের পদ্ধতিতে @ লেনদেন ব্যবহার করবেন না। কিন্তু পরিষেবা পদ্ধতিতে যেগুলি সংগ্রহস্থল ব্যবহার করে।
ব্যবহারকারী 1567291

4
রেপোতে @ ট্রান্সজেকশনাল তৈরির অর্থ হ'ল পরিষেবাটির অভ্যন্তরে পরিষেবা যদি আপনি একাধিকবার রেপো কল করেন তবে প্রত্যেকের আলাদা আলাদা লেনদেন হবে, সুতরাং 1 টি প্রশ্নের মধ্যে রোলব্যাক করুন। আপনি যদি পরিষেবা স্তরে সরবরাহ করেন তবে আপনার পুরো ফাংশনটি কোনও ত্রুটিতে রোলব্যাক হবে।
পি সতীশ প্যাট্রো

80

প্রদত্ত পদ্ধতির নাম ব্যবহার করে মুছে ফেলা প্রশ্নের ব্যয়গুলি স্প্রিং ডেটা জেপিএর সংস্করণ 1.6.0.RC1 দিয়ে শুরু করে সমর্থিত । কীওয়ার্ডগুলি removeএবং deleteসমর্থিত। রিটার্ন মান হিসাবে নাম্বার বা সরানো সত্তার তালিকার মধ্যে একটি চয়ন করতে পারে।

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);

7

আপনি যদি স্প্রিং ডেটা জেপিএ, এবং বিশেষত PartTreeJpaQueryশ্রেণীর উত্স কোডটি একবার দেখে থাকেন তবে দেখবেন এটি তাত্ক্ষণিকভাবে চেষ্টা করার চেষ্টা করছে PartTree। এই শ্রেণীর ভিতরে নিম্নলিখিত নিয়মিত অভিব্যক্তি

private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\\p{Lu}.*?)??By")

কি অনুমোদিত এবং কি না তা নির্দেশ করে।

অবশ্যই আপনি যদি এই জাতীয় পদ্ধতি যুক্ত করার চেষ্টা করেন তবে আপনি দেখতে পাবেন যে এটি কাজ করে না এবং আপনি পুরো স্ট্যাকট্রেস পান।

আমার মনে রাখা উচিত যে আমি 1.5.0.RELEASEস্প্রিং ডেটা জেপিএর সংস্করণটি ব্যবহার করছি


7

2 উপায়: -

1 ম কাস্টম ক্যোয়ারী

@Modifying
@Query("delete from User where firstName = :firstName")
void deleteUsersByFirstName(@Param("firstName") String firstName);

পদ্ধতি অনুসারে দ্বিতীয় এক জেপিএ ক্যোয়ারী

List<User> deleteByLastname(String lastname);

আপনি যখন পদ্ধতির মাধ্যমে ক্যোয়ারিতে যান (দ্বিতীয় উপায়) এটি প্রথমে একটি কল কল করবে

select * from user where last_name = :firstName

তারপরে এটি এটিকে একটি তালিকায় লোড করবে তারপরে একে একে মুছে ফেলুন আইডি call

delete from user where id = 18
delete from user where id = 19

প্রথমে অবজেক্টের তালিকা আনুন, তারপরে লুপের জন্য আইডি একে একে মুছে ফেলুন

তবে, প্রথম বিকল্প (কাস্টম ক্যোয়ারী),

এটি কেবল একটি একক ক্যোয়ারী এটি মানটি যেখানেই উপস্থিত রয়েছে তা মুছে ফেলবে।

এই লিঙ্কটি দিয়েও https://www.baeldung.com/spring-data-jpa-deleteby যান lete


4
তথ্যের জন্য ধন্যবাদ!
কৌতূহলী 1

2

আপনি যদি বসন্ত জেপিএ দ্বারা সরবরাহিত পূর্বনির্ধারিত মোছার পদ্ধতিগুলি ব্যবহার করেন তবে নীচে দুটি প্রশ্নের ফ্রেমওয়ার্ক দ্বারা কার্যকর করা হবে।

  • প্রথমে ডেটা সংগ্রহ করুন (আইডি এবং অন্যান্য কলামের মতো) যেখানে ক্লজটি মুছে ফেলুন জিজ্ঞাসা দিয়ে সিলেক্ট কোয়েরি সম্পাদন করুন collect

  • তারপরে প্রথম ক্যোয়ারীর ফলাফলসেটের পরে, দ্বিতীয় মোছা অনুসন্ধানগুলি সমস্ত আইডির জন্য কার্যকর করা হবে (একে একে)

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

কোয়েরি কোড মোছার জন্য এটি অন্য একটি অনুকূলিত উপায়, কারণ নীচে কাস্টমাইজড পদ্ধতিগুলি ব্যবহার করে কেবল একটি মুছা কোয়েরি কার্যকর করা হবে।



@NamedNativeQueries({

@NamedNativeQuery(name = "Abc.deleteByCreatedTimeBetween",
            query = "DELETE FROM abc WHERE create_time BETWEEN ?1 AND ?2")
    ,

    @NamedNativeQuery(name = "Abc.getByMaxId",
            query = "SELECT max(id) from abc")
})

@Entity
public class Abc implements Serializable {

}

@Repository
public interface AbcRepository extends CrudRepository {

    int getByMaxId();

    @Transactional
    @Modifying
    void deleteByCreatedTimeBetween(String startDate, String endDate);
}


2

আপনি যখন ব্যাচ মোছার জন্য উত্সযুক্ত ক্যোয়ারী ব্যবহার করেন তখন যত্নশীল হন। এটি আপনি যা প্রত্যাশা করেন তা নয়: মুছে ফেলুন


ওহে. আপনি যদি আরবিএআর নির্দেশ করছেন (সারি সারি সারি করে), আপনি কি নিজের উত্তরে এটি যুক্ত করতে পারবেন? (এবং আমি upvote করব) আমি এখানে আপনি কী নির্দেশ করছেন তা অনুমান করছি।
গ্রানাডা কোডার

0

হ্যাঁ, ডিলিটবাই পদ্ধতিটি সমর্থিত এটি ব্যবহার করার জন্য আপনাকে @ ট্রান্সজেকশনাল দিয়ে পদ্ধতিটি টিকিয়ে রাখতে হবে


0

এখানে আমার 2 সেন্ট অনুসরণ করুন। আপনি দেশীয় প্রশ্নগুলিও ব্যবহার করতে পারেন, যেমন:

@Modifying
@Query(value="delete from rreo r where r.cod_ibge = ?1 and r.exercicio= ?2", nativeQuery = true)
void deleteByParameters(Integer codIbge, Integer exercicio);

0
@Query(value = "delete from addresses u where u.ADDRESS_ID LIKE %:addressId%", nativeQuery = true)
void deleteAddressByAddressId(@Param("addressId") String addressId);

4
স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। কোনও পুরানো প্রশ্নের উত্তর গ্রহণের আগে একটি স্বীকৃত উত্তর রয়েছে (সবুজ দেখুন ✓) পাশাপাশি অন্যান্য উত্তরগুলি নিশ্চিত করুন যে আপনার উত্তরটি নতুন কিছু যুক্ত করেছে বা সেগুলির ক্ষেত্রে অন্যথায় সহায়ক। এছাড়াও কোনও ব্যাখ্যা ছাড়াই কেবল কোড পোস্ট করা সহায়ক নয় কারণ এটি কেন বা কীভাবে প্রশ্নের উত্তর দেয় তা ব্যাখ্যা করে না। আপনার পোস্টের গুণমান উন্নত করতে দয়া করে আপনার কোডের জন্য একটি ব্যাখ্যা অন্তর্ভুক্ত করুন । আমি একটি ভাল উত্তর লিখতে না দয়া করে দেখুন ?
আইভো মরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.