2013-10-28 3 views
12

मैं हाइबरनेट के लिए नया हूं और मैं डेटाबेस से कुछ डेटा प्राप्त करने का प्रयास कर रहा हूं। मैं पूरा डेटा नहीं प्राप्त करना चाहता हूं लेकिन एक इकाई का प्रक्षेपण चाहता हूं।जावा - हाइबरनेट मानदंड .setResultTransformer() डिफ़ॉल्ट मानों के साथ मॉडल फ़ील्ड्स प्रारंभ करता है

बात यह है कि जब मुझे आईडी और मेरे प्रक्षेपण का नाम मिलता है तो फॉर-लूप में, यह आईडी = 7 और नाम = "नाम 8" के बजाय डिफ़ॉल्ट मान id = 0 और name = null प्राप्त करता है डेटाबेस में मूल इकाई के रिकॉर्ड हैं। क्या आप जानते हैं कि इस समस्या का कारण क्या है? फॉर-लूप अंतिम कोड में है।

यहाँ छात्र इकाई

@Entity(name = "Students") 
public class Student { 
    @Id 
    @GeneratedValue 
    @Column(name = "StudentId") 
    private int id; 

    @Column(name = "Name", nullable = false, length = 50) 
    private String name; 

    @Column(name = "Grade") 
    private Double grade = null; 

    @ManyToOne(cascade = CascadeType.PERSIST) 
    @JoinColumn(name = "FacultyId", nullable = false) 
    private Faculty faculty; 

    @ManyToMany(cascade = CascadeType.PERSIST) 
    @JoinTable(
     joinColumns = @JoinColumn(name = "StudentId"), 
     inverseJoinColumns = @JoinColumn(name = "CourseId")) 
    private Collection<Course> courses; 

    public Student() { 
     this.courses = new HashSet<Course>(); 
    } 

    // Setters and Getters for all fields 
} 

है यहाँ StudentModel

public class StudentModel { 
    private int id; 
    private String name; 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

और कोड मैं

Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    { 
     Criteria criteria = session.createCriteria(Student.class); 
     criteria.add(Restrictions.eq("name", "Name 8")) 
       .setProjection(
         Projections.projectionList() 
           .add(Projections.property("id")) 
           .add(Projections.property("name"))) 
       .setResultTransformer(
         Transformers.aliasToBean(StudentModel.class)); 

     @SuppressWarnings("unchecked") 
     List<StudentModel> students = criteria.list(); 

     for (StudentModel student : students) { 
      System.out.println(student.getId()); 
      System.out.println(student.getName()); 
     } 

     session.getTransaction().commit(); 
     session.close(); 
    } 

उत्तर

21

को क्रियान्वित कर रहा हूँ आप शायद बस अपने अनुमानों के उपनाम आवंटित करने के लिए भूल गया है :

Projections.projectionList() 
      .add(Projections.property("id"), "id") 
      .add(Projections.property("name"), "name") 
+1

जब गुणों का एक ही नाम होता है, तो हमें उपनाम निर्दिष्ट क्यों करना पड़ता है? – Ram

+0

आपने मेरा जीवन बचाया !!! धन्यवाद – Erez

4

इसके अलावा और टिप्पणी @Ram पर प्रतिक्रिया के लिए:

Projections.projectionList() 
     .add(Projections.property("id"), "id") 
     .add(Projections.property("name"), "name") 

"id" और "नाम" अपने डेटाबेस में वे "StudentId" और "नाम दिया गया है अपने छात्र कक्षा में जावा फ़ील्ड नाम हैं, लेकिन नाम ", इसके अलावा हाइबरनेट नाम संघर्ष से बचने के लिए यादृच्छिक उपनाम के साथ SQL क्वेरी उत्पन्न करता है, इसलिए परिणामस्वरूप सेट" आईडी "और" नाम "कॉलम नहीं होता है। उपरोक्त उदाहरण में दूसरा पैरामीटर उपनाम नाम को मजबूर करता है।

हाइबरनेट ऐसा एसक्यूएल उत्पन्न:

SELECT students0_.StudientId as StudientId12, students0_.Name as Name34, students0_.Grade as Grade11 FROM Students students0_ 

आप हाइबरनेट कॉन्फ़िग फ़ाइल hibernate.cfg.xml में सच करने के लिए hibernate.show_sql की स्थापना द्वारा सांत्वना/लॉग में उत्पन्न SQL क्वेरी प्रदर्शित करने के लिए हाइबरनेट बता सकते हैं।

संबंधित मुद्दे