2016-11-07 2 views
0

Ich habe eine Entität aufrufen Student mit wenigen Feldern im Zusammenhang mit Studenten und eine Liste von Subject mit oneToMany Beziehung. Hier muss ich alle Felder einschließlich der Liste der Betreffzeile außer "Bild" abrufen, da es mehr Speicher benötigt, es dauert lange, alle Zeilen abzurufen. Kann jemand sagen, wie man Projektion und Kriterien erstellt, um dieses Student-Objekt ohne Bildfeld alleine zu erhalten? Gibt es benutzerdefinierte Transformatoren wie "AliasToBeanNestedResultTransformer"? Da dies für mein Szenario nicht funktionieren wird, in dem ich eine Liste von Subjekten als OneToMany-Beziehung habe.Hibenrate + Projektion und Kriterien für Entität mit geschachtelter Liste Entität

@Entity 
@Table(name="STUDENT") 
public class Student { 
    @id 
    private long studentId; 
    private String name; 
    private String dob; 
    private int age; 

    @Lob 
    private byte[] image; 

    @Lob 
    private byte[] imageTnail; 

    @OneToMany(mappedBy="subject", cascade = CascadeType.ALL, orphanRemoval=true) 
    private List<Subject> subjects; 

    //setter & getter... 
} 



@Entity 
@Table(name="SUBJECT") 
public class Subject { 

    @id 
    private long subjectId; 
    private String subjectName; 

    @ManyToOne 
    @JoinColumn(name="studentId") 
    private Student student; 
} 

bearbeiten

List<Student> results = getSession().createCriteria(Student.class) 
      .setProjection(Projections.projectionList() 
       .add(Property.forName("studentId")) 
       .add(Property.forName("name")) 
       .add(Property.forName("dob")) 
       .add(Property.forName("age")) 
      ).setResultTransformer(Transformers.aliasToBean(Student.class)).list(); 


    System.out.println("StudentDaoImpl.getStudents()"+results.get(0).getName()); 

Antwort

0

allererst muss mappedBy Attribut den Namen des Fremdschlüssel halten, so dass Sie diese Korrektur tun ll müssen:

@OneToMany(mappedBy="student", cascade = CascadeType.ALL, orphanRemoval=true) 
private List<Subject> subjects; 

zweitens, YES Sie können Liste der Schüler, ohne ihre Bilder zu erhalten:

List<T> results = session.createCriteria(Student.class) 
    .setProjection(Projections.projectionList() 
     .add(Property.forName("studentId")) 
     .add(Property.forName("name")) 
     .add(Property.forName("dob")) 
     .add(Property.forName("age")) 
    ) 
    .setResultTransformer(Transformers.aliasToBean(Student.class); 
    .list(); 

Wenn Sie einen bestimmten Schüler

List<T> results = session.createCriteria(Student.class) 
     .setProjection(Projections.projectionList() 
      .add(Property.forName("studentId")) 
      .add(Property.forName("name")) 
      .add(Property.forName("dob")) 
      .add(Property.forName("age")) 
     ).add(Restrictions.eq("studentId", @idAsParam)) 
     .setResultTransformer(Transformers.aliasToBean(Student.class); 
     .list(); 

das erste Objekt erhalten wollen, können das Objekt halten.

+0

Dies funktioniert, aber ich bin Themen als null zu bekommen. Ich sollte jedes Thema mit jedem Schüler verbinden. – Mohan

+0

so müssen Sie es in Ihrer Projektion hinzufügen: '.add (Property.forName (" Themen "))' –

+0

Hinzugefügt oben genannten Code. Ich sehe, dass das Student-Objekt zurückgegeben wird, aber alle Felder haben einen Nullwert. Ist das etwas, was ich vermisse? – Mohan

1

diese Lösung Versuchen:

List<T> results = session.createCriteria(Student.class) 
    .setProjection(Projections.projectionList() 
     .add(Property.forName("studentId"),"studentId") 
     .add(Property.forName("name"),"name") 
     .add(Property.forName("dob"),"dob") 
     .add(Property.forName("age"),"age") 
    ).add(Restrictions.eq("studentId", @idAsParam)) 
    .setResultTransformer(Transformers.aliasToBean(Student.class); 
    .list(); 
+0

Während dieser Code die Frage beantworten kann, würde das Bereitstellen eines zusätzlichen Kontexts hinsichtlich dessen, wie und/oder warum er das Problem löst, den langfristigen Wert der Antwort verbessern. –

+1

Außerdem scheint es auf den ersten Blick wie ein Copy-Paste von der anderen Antwort (ich sehe den Unterschied jetzt). Vielleicht könnte es nützlich sein zu bemerken, warum die andere Antwort für Sie nicht funktioniert hat und warum Sie die Änderungen, die Sie vorgenommen haben, vorgenommen haben. –

Verwandte Themen