ฉันคิดว่าวิธีที่ง่ายที่สุดคือใช้สิ่งที่เรียกว่าการฉายภาพ สามารถแมปผลลัพธ์แบบสอบถามกับอินเทอร์เฟซ การใช้งานSqlResultSetMapping
ไม่สะดวกและทำให้โค้ดของคุณน่าเกลียด :)
ตัวอย่างจากแหล่งข้อมูล Spring JPA ซอร์สโค้ด:
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();
}
}
คุณยังสามารถใช้วิธีนี้เพื่อดูรายการประมาณการ
ตรวจสอบรายการเอกสาร JPA ข้อมูลฤดูใบไม้ผลินี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการคาดการณ์
หมายเหตุ 1:
อย่าลืมUser
กำหนดเอนทิตีของคุณตามปกติ - ฟิลด์จากอินเทอร์เฟซที่คาดการณ์ไว้จะต้องตรงกับฟิลด์ในเอนทิตีนี้ มิฉะนั้นการแมปฟิลด์อาจเสีย ( getFirstname()
อาจส่งคืนค่าของนามสกุลและอื่น ๆ )
โน้ต 2:
หากคุณใช้SELECT table.column ...
สัญกรณ์ให้กำหนดนามแฝงที่ตรงกับชื่อจากเอนทิตีเสมอ ตัวอย่างเช่นรหัสนี้ทำงานไม่ถูกต้อง (การฉายภาพจะคืนค่า null สำหรับแต่ละ getter):
@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
กับพื้นที่เก็บข้อมูลแบบกำหนดเองแทน