2013-10-28 16 views
12

Hazırda bekletme durumundayım ve veri tabanından veri almaya çalışıyorum. Tam verileri almak istemiyorum ama bir varlığın izdüşümü.Java - Hazırda bulunan ölçütler.setResultTransformer() model alanlarını varsayılan değerlerle başlatır

İşin özü, projeksiyonumun kimliğini ve ismini aldığımda, varsayılan değerlerini alır id = 0 ve ad = null yerine id = 7 ve name = "Name 8" Veritabanındaki orijinal varlığın kayıtlarıdır. Bu sorunun nedenini biliyor musun? For döngüsü, son kodda. İşte

İşte 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; 
    } 
} 

Ve Muhtemelen sadece tahminlere adlar atamak için unuttum ben

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(); 
    } 

cevap

21

yürütme am kodudur Öğrenci Varlık

@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 
} 

olduğunu :

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

Özellikler aynı ada sahip olduğunda, neden diğer adları belirtmek zorundayız? – Ram

+0

Hayatımı kurtardın !!! Teşekkürler – Erez

4

Ayrıca ve yorumunu @Ram cevap:

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

"id" ve "ad" veritabanınızda onlar "StudentId" ve "adlandırılır senin Öğrenci sınıfta Java alan adı, ancak Ad ", dahası hibernate ad çakışmasından kaçınmak için rasgele takma ad ile SQL sorgusu üretir, sonuçta" id "ve" name "sütunu yoktur. Yukarıdaki örnekteki ikinci parametre, takma adı zorlar.

hazırda böyle SQL oluşturmak:

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

Sen hazırda yapılandırma dosyası hibernate.cfg.xml true hibernate.show_sql ayarlayarak konsol/günlüğüne oluşturulan SQL sorgusu görüntülemek için hazırda bekletme söyleyebilir.

İlgili konular