লাইক সহ স্প্রিং জেপিএ @ কুইরি


95

আমি ক্রুডেপোসিটরিতে একটি পদ্ধতি তৈরি করার চেষ্টা করছি যা আমাকে ব্যবহারকারীদের তালিকা দিতে সক্ষম হবে, যার ব্যবহারকারীর নামগুলি ইনপুট প্যারামিটারের মতো (কেবল এটি দিয়েই শুরু নয়, এটিতে রয়েছে )ও। আমি পদ্ধতিটি ব্যবহার করার চেষ্টা করেছি "findUserByUsernameLike(@Param("username") String username)"তবে যেমনটি স্প্রিং ডকুমেন্টেশনে বলা হয়েছে, এই পদ্ধতিটি " where user.username like ?1" এর সমান । এটি আমার পক্ষে ভাল নয়, কারণ আমি ইতিমধ্যে বলেছি যে আমি ব্যবহারকারীর নাম থাকা সমস্ত ব্যবহারকারীকে পাওয়ার চেষ্টা করছি ...

আমি পদ্ধতিটিতে একটি ক্যোয়ারী লিখেছি কিন্তু এটি এমনকি স্থাপন করা হয় না।

@Repository
public interface UserRepository extends CrudRepository<User, Long> {

@Query("select u from user u where u.username like '%username%'")
List<User> findUserByUsernameLike(@Param("username") String username);
}

কেহ এই আমাকে সাহায্য করতে পারেন?


4
containingসূচকগুলি থেকে উপকারের জন্য আপনি ব্যবহার করতে পারেন , ডকস.স্প্রিং.আইও

উত্তর:


173

নিম্নলিখিত পদ্ধতির ব্যবহার করার চেষ্টা করুন (এটি আমার পক্ষে কাজ করে):

@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')")
List<String> findUsersWithPartOfName(@Param("username") String username);

বিজ্ঞপ্তি: জেপিকিউএলে থাকা সারণির নামটি অবশ্যই মূলধনির সাথে শুরু করা উচিত।


11
বা WHERE UPPER(u.username) LIKE CONCAT('%',UPPER(:username),'%')কেস-সংবেদনশীল অনুসন্ধান করতে
ব্র্যাড ম্যাস

এসকিউএল-ইঞ্জেকশন আপনার সমাধান ব্যবহার করে সম্ভব? (
কনক্যাটের

@ রামডেন সবগুলি @Paramস্যানিটাইজড, তাই না।
নুরেটিন

আপনি ঠিক যেমন করতে পারেন: ব্যবহারকারীর নাম এবং তারপরে .setParameter ("ব্যবহারকারীর নাম", "% foo%");
ম্যাথু ডাউম্যান

.setParameter ("ব্যবহারকারীর নাম", "% foo%") কীভাবে সেট করবেন; @MatthewDaumen
xuezhongyu01

122

পদ্ধতির নামগুলি থেকে ক্যোয়ারী ক্রিয়েশন ব্যবহার করে , টেবিল 4 দেখুন যেখানে তারা কয়েকটি কীওয়ার্ড ব্যাখ্যা করে।

  1. মত ব্যবহার: select ... like :username

     List<User> findByUsernameLike(String username);
    
  2. দিয়ে শুরু: select ... like :username%

     List<User> findByUsernameStartingWith(String username);
    
  3. সমাপ্তি সহ: select ... like %:username

     List<User> findByUsernameEndingWith(String username);
    
  4. ধারণ করে: select ... like %:username%

     List<User> findByUsernameContaining(String username);
    

লক্ষ্য করুন যে আপনি যে উত্তরটি সন্ধান করছেন তা 4 নম্বর । আপনি @ কিচুরি ব্যবহার করতে হবে না


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

11
কেবল এটি যুক্ত করতে চেয়েছিলেন যে আপনার প্রয়োজনের মতো, List<User> findByUsernameContainingIgnoreCase(String username);
রবার্ট

শতাংশ চিহ্নটি উল্টানো উচিত StartingWith: select ... like :username%এবং EndingWith: select ... like %:username... যাইহোক দুর্দান্ত উত্তর ... গ্রহণযোগ্য হওয়া উচিত। ধন্যবাদ
আলেসান্দ্রো

@ রবার্টের আমার কাছে বড় হাতের সাথে একটি কলামের ডেটা রয়েছে এবং আমি জেপিকিউএল পদ্ধতির মতো ব্যবহার করেছি এবং লোয়ার কেসের মান পাস করেছি এবং মানগুলি পেতে সক্ষম হয়েছি। IgnoreCase ছাড়াও এটি অনুচিত ক্ষেত্রে ডেটা আনছে data কেন এই অদ্ভুত আচরণ ঘটে?
গ্রিনহর্ন

@ গ্রীনহর্ন দয়া করে একটি পৃথক স্ট্যাকওভারফ্লো প্রশ্নটি খুলুন এবং টেবিলে আপনার ডেটা এবং আপনি কী জিজ্ঞাসা করছেন তার কিছু উদাহরণ যুক্ত করুন।
রবার্ট

25

অন্য উপায়: পরিবর্তে CONCATফাংশন আমরা ডাবল পাইপ ব্যবহার করতে পারি :: পদবি || '%'

@Query("select c from Customer c where c.lastName LIKE :lastname||'%'")
List<Customer> findCustomByLastName( @Param("lastname") String lastName);

আপনি যে কোনও জায়গায়, উপসর্গ, প্রত্যয় বা উভয়ই রাখতে পারেন

:lastname ||'%'  
'%' || :lastname  
'%' || :lastname || '%'  

10

List<User> findByUsernameContainingIgnoreCase(String username);

যাতে মামলার বিষয়গুলি উপেক্ষা করা যায়


এসকিউএল-ইঞ্জেকশন আপনার সমাধান ব্যবহার করে সম্ভব?
xuezhongyu01

9

আপনার ক্ষেত্রে, আপনি সরাসরি জেপিএ পদ্ধতি ব্যবহার করতে পারেন। এটি নমো মত:

ধারণ করে: নির্বাচন করুন ... যেমন%: ব্যবহারকারীর নাম%

List<User> findByUsernameContainingIgnoreCase(String username);

এখানে, IgnoreCase আপনাকে কেসটিকে উপেক্ষা করে আইটেম অনুসন্ধান করতে সহায়তা করবে।

এখানে সম্পর্কিত কিছু পদ্ধতি রয়েছে:

  1. পছন্দ findByFirstnameLike

    … যেখানে x. প্রথম নামটি? 1

  2. দিয়ে শুরু findByFirstnameStartingWith

    … যেখানে x. প্রথম নামটি পছন্দ করে? 1 (প্যারামিটার সংযুক্ত% এর সাথে আবদ্ধ)

  3. সমাপ্তি সহ findByFirstnameEndingWith

    … যেখানে x. প্রথম নামটি পছন্দ করে? 1 (প্যারামিটারটি প্রেন্টেন্ড% দিয়ে আবদ্ধ)

  4. ধারণ করে findByFirstnameContaining

    … যেখানে x. প্রথম নামটি? 1 (প্যারামিটার আবদ্ধ%)

আরও তথ্য, এই লিঙ্ক এবং এই লিঙ্কটি দেখুন

আশা করি এটা তোমাকে সাহায্য করবে :)


4
ধন্যবাদ! জেপিএ কনভেনশনগুলি ব্যবহার করা সঠিক উপায়ে মনে হয়।
ফিগলেট নিউটন


3

এই উপায়টি আমার জন্য কাজ করে, (স্প্রিং বুট সংস্করণ ২.০.১ ব্যবহার করে। রিলিজ):

@Query("SELECT u.username FROM User u WHERE u.username LIKE %?1%")
List<String> findUsersWithPartOfName(@Param("username") String username);

ব্যাখ্যা:? 1,? 2,? 3 ইত্যাদি স্থানধারকরা প্রথম, দ্বিতীয়, তৃতীয় পরামিতি ইত্যাদি etc. এই ক্ষেত্রে প্যারামিটারটি% দ্বারা বেষ্টিত হওয়ার পক্ষে যথেষ্ট যদি এটি একটি স্ট্যান্ডার্ড এসকিউএল কোয়েরি হয় তবে এটি ছাড়া একক উদ্ধৃতি।


4
আপনার সংখ্যার পরিবর্তে নামকরণের প্যারামিটারগুলি পছন্দ করা উচিত:@Query("SELECT u.username FROM User u WHERE u.username LIKE %:username%")
রাল্ফ

0
@Query("select u from user u where u.username LIKE :username")
List<User> findUserByUsernameLike(@Param("username") String username);

ধন্যবাদ, হতাশার সমস্যাটি ছিল যে জেপিকিএল কেস সংবেদনশীল, এখন এটি মোতায়েন করা হচ্ছে, তবে 'লাইক' আমার ইচ্ছা মতো কাজ করে না। এটি কেবলমাত্র রেকর্ডগুলি সন্ধান করে যা সম্পূর্ণভাবে ইনপুট প্যারামিটারের সমান (এটি ধারণ করে না)।
ভিক্টোরিয়া

-1
@Query("select b.equipSealRegisterId from EquipSealRegister b where b.sealName like %?1% and b.deleteFlag = '0'" )
    List<String>findBySeal(String sealname);

আমি এই কোডটি চেষ্টা করেছি এবং এটি কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.