मैं स्प्रिंग बूट जेपीए के लिए नया हूँ। मैं सूची के रूप में वापसी प्रकार प्राप्त करना चाहता हूं लेकिन मुझे सिर्फ सूची मिल रही है

मेरी इकाई वर्ग

@Component
@Entity
@Table(name = "USERDB.USERS")
public class User() {
  @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ")
    @SequenceGenerator(sequenceName = "MY_SEQ_NAME", allocationSize = 1), name = "MY_SEQ")
  @Column(name = "userId")
  private long id;
  @Column(name = "firstName")
  private String fName;
  @Column(name = "midName")
  private String mName;
  @Column(name = "lastName")
  private String lName;
  @Column(name = "email")
  private String email;
  @Column(name = "createdDate")
  private Timestamp createdOn;

public User() {
    this.createdOn = new Timestamp(System.currentTimeMillis()
}

//SETTERS & GETTERS

}

मेरा भंडार;

public interface UserRepository extends JpaRepository<User, String> {

  @Query("SELECT id fName, lastName, email FROM User u WHERE u.fName=(:fName)")
  public List<User> findByEmail(@Param("fName") String fName);

}

मैं चाहता था कि नीचे की तरह मुख्य मूल्य जोड़ी के साथ एक उपयोगकर्ता सरणी के रूप में एक जेसन प्रतिक्रिया प्राप्त करें:

    [
   [
     "id": 1001,
     "fName": John",
     "lName": "Doe",
     "email": "johnd@example.com"       
   ],
   [
     "id": 1002,
     "fName": "John",
     "lName": "Simmons",
     "email": "johns@example.com"       
   ],

]

लेकिन मुझे नीचे दिए गए मानों के साथ एक सूची मिल रही है।

[
   [
     1001,
     "John",
     "Doe",
     "johnd@example.com"       
   ],
   [
     1002,
     "John",
     "Simmons",
     "johns@example.com"       
   ],

]

मुझे यकीन नहीं है कि मैं कहाँ गलत कर रहा हूँ या यह है कि मुझे कैसे प्राप्त करना चाहिए? यह मेरे वास्तविक कार्यक्रम का एक काल्पनिक उदाहरण है। कृपया मुझे किसी भी त्रुटि के लिए क्षमा करें।

यहाँ मेरा नियंत्रक वर्ग है

@Restcontroller
public class UserController {
@Autowired
UserRepository repo;
@GetMapping("/user/{fname}")
  public List<User> getUserByName(
         @PathVariable("fname") String fname) {

  return repo.findByEmail(fname);
  }
}
0
Thomson 6 अप्रैल 2020, 05:15
1
अपना नियंत्रक कोड दिखाएं।
 – 
123
6 अप्रैल 2020, 05:48
आपको उपयोगकर्ताओं की सूची नहीं बल्कि स्तंभों की सूची मिल रही है। प्रत्येक पंक्ति के लिए आपको User ऑब्जेक्ट के बजाय, कॉलम से मानों की एक सूची मिलती है। तो या तो बस उपयोगकर्ता को पुनः प्राप्त करें, और उसे भेजें या प्रक्षेपण
 – 
M. Deinum
6 अप्रैल 2020, 09:10

3 जवाब

आपके कोड पर कुछ बिंदु:

public interface UserRepository extends JpaRepository<User, String> {

   Query("SELECT id fName, lastName, email FROM User u WHERE u.fName=(:fName)")
   public List<User> findEmails(@Param("fName") String fName);

 }

आप JpaRepository<User, String> के साथ रिपोजिटरी बना रहे हैं लेकिन आपकी कक्षा में User आईडी String प्रकार की नहीं है। आईडी फ़ील्ड को एक स्ट्रिंग बनाने पर विचार करें।

विधि findEmails है, लेकिन यह List<User> लौटा रही है? मैं इस तरह के एक समारोह को List<String> वापस करने की उम्मीद करता हूं - निश्चित रूप से प्रत्येक स्ट्रिंग एक ईमेल है। भविष्य में भ्रम से बचने के लिए आप इस फ़ंक्शन का नाम बदलने पर विचार कर सकते हैं। हालांकि बहुत बड़ी बात नहीं है।

आपकी क्वेरी में:

@Query("SELECT id fName, lastName, email FROM User u WHERE u.fName=(:fName)")

आपको इसे इसमें बदलना चाहिए:

@Query("SELECT u.id u.fName, u.lastName, u.email FROM User u WHERE u.fName=(:fName)")

आपके पास होने वाली क्रमबद्धता समस्या को ठीक करना चाहिए।

0
Fermi-4 6 अप्रैल 2020, 05:45
उत्तर के लिए धन्यवाद। कृपया कोड में ज्यादा न खोएं क्योंकि यहां स्टैक ओवरफ्लो में नमूना एप्लिकेशन को कोड किया गया है। मैं चाहता था कि मुख्य मूल्य जोड़ी के साथ वस्तु का एक जेसन सरणी हो।
 – 
Thomson
6 अप्रैल 2020, 08:28
ठीक, कोई समस्या नहीं! अगर क्वेरी अपडेट आपके काम नहीं आता है तो मुझे बताएं।
 – 
Fermi-4
6 अप्रैल 2020, 08:44
धन्यवाद, लेकिन क्षमा करें, कुछ भी नहीं बदला। मुझे अभी भी सूची मिल रही है <सूची <स्ट्रिंग >>
 – 
Thomson
6 अप्रैल 2020, 08:53

मैं फर्मी -4 के सुझाव से बहुत सहमत हूं। एक बेहतर आसान प्रबंधनीय कोड के लिए बेहतर नामकरण परंपरा का उपयोग करना महत्वपूर्ण है। आपको उनका पालन करना चाहिए। अपनी समस्या को हल करने के लिए, बस निम्न कार्य करें और यह आपकी समस्या का समाधान करेगा।

   public interface UserRepository extends JpaRepository<User, long> {


  public List<User> findByFname(String fName);

 }

साथ ही, नीचे दिए गए क्रमानुसार कार्यान्वयन को जोड़ने के लिए USER Entity की परिभाषा बदलने पर विचार करें

    @Component
    @Entity
    @Table(name = "USERDB.USERS")    
    public class User implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 3L;
0
Abhishek kumar 6 अप्रैल 2020, 09:03
धन्यवाद अभिषेक, लेकिन मेरा वास्तविक कोड अलग है और मुझे कस्टम क्वेरी का उपयोग करने की आवश्यकता है। हां मैंने Serializable लागू किया था। क्षमा करें यह मेरे काम के लिए है इसलिए मैं अपने वास्तविक कोड यहां पेस्ट नहीं कर सका
 – 
Thomson
6 अप्रैल 2020, 09:07
  1. केवल कुछ तर्कों के साथ अतिरिक्त User कंस्ट्रक्टर बनाएं जिन्हें आप तालिका से प्राप्त करना चाहते हैं
public User(long id, String fName, String lastName, String email) {
    this.id = id;
    this.fName = fName;
    this.lastName = lastName;
    this.email = email;
}
  1. जेपी क्वेरी को निम्नलिखित की तरह समायोजित करें
@Query("SELECT new com.package.User(u.id, u.fName, u.lastName, u.email) FROM User u WHERE u.fName = :fName")
public List<User> findByEmail(@Param("fName") String fName);

com.package को अपने User के वास्तविक पैकेज से बदलें

0
Nikolai Shevchenko 6 अप्रैल 2020, 12:46