আমি মনে করি এটি করার সবচেয়ে সহজ উপায় হ'ল তথাকথিত অভিক্ষেপ ব্যবহার করা। এটি ইন্টারফেসে ক্যোয়ারির ফলাফলগুলি ম্যাপ করতে পারে। ব্যবহার SqlResultSetMapping
করা অসুবিধাজনক এবং আপনার কোডটিকে কুৎসিত করে তোলে :)।
বসন্তের তথ্য জেপিএ উত্স কোড থেকে সরাসরি একটি উদাহরণ:
public interface UserRepository extends JpaRepository<User, Integer> {
@Query(value = "SELECT firstname, lastname FROM SD_User WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
public static interface NameOnly {
String getFirstname();
String getLastname();
}
}
আপনি অনুমানগুলির একটি তালিকা পেতে এই পদ্ধতিটিও ব্যবহার করতে পারেন।
অনুমান সম্পর্কে আরও তথ্যের জন্য এই বসন্তের ডেটা জেপিএ ডক্স এন্ট্রি দেখুন।
নোট 1:
আপনার User
সত্তাকে স্বাভাবিক হিসাবে সংজ্ঞায়িত করা মনে রাখবেন - অনুমান করা ইন্টারফেসের ক্ষেত্রগুলি অবশ্যই এই সত্তার ক্ষেত্রগুলির সাথে মেলে। অন্যথায় ফিল্ড ম্যাপিংটি ভেঙে যেতে পারে ( getFirstname()
শেষ নাম এবং সেটেরার মান ফিরে আসতে পারে)।
নোট 2:
আপনি যদি SELECT table.column ...
স্বরলিপি ব্যবহার করেন তবে সর্বদা সত্তার থেকে নামগুলির সাথে মিলে যাওয়া নামগুলি সংজ্ঞায়িত করুন। উদাহরণস্বরূপ এই কোডটি সঠিকভাবে কাজ করবে না (প্রজেকশন প্রতিটি প্রাপ্তির জন্য নাল ফেরায়):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
তবে এটি কাজ করে:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
আরও জটিল প্রশ্নের ক্ষেত্রে আমি JdbcTemplate
পরিবর্তে কাস্টম সংগ্রহস্থল ব্যবহার করব।