2016-11-07 4 views
0

У меня есть вызов объекта Student с несколькими полями, связанными со студентом, и список Subject с отношением oneToMany. Здесь мне нужно получить все поля, включая Список объектов, кроме «изображения», так как он использует больше памяти, для получения всех строк требуется много времени. Может ли кто-нибудь сказать, как создать проекцию и критерии для извлечения этого объекта Student без поля изображения? Есть ли какой-либо пользовательский трансформатор результатов, например, «AliasToBeanNestedResultTransformer»? Поскольку это не сработает для моего сценария, когда у меня есть Список предметов как отношения OneToMany.Hibenrate + Проекция и критерии для объекта с вложенным объектом списка

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

Редактировать

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

ответ

0

первую очередь, атрибут mappedBy должен содержать имя внешнего ключа, так что вы должны будете сделать это исправление:

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

во-вторых, YES вы можете удалить список учеников, не получая их изображений:

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

, если вы хотите, чтобы получить конкретного учащегося

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

первый объект будет содержать объект.

+0

Это работает, но я получаю предметы нулевой. Я должен получить все предметы, связанные с каждым учеником. – Mohan

+0

, поэтому вам нужно добавить его в свою проекцию: '.add (Property.forName (" subject "))' –

+0

Добавленный код, о котором идет речь. Я вижу объект Student, но все поля имеют нулевое значение. Это что-то, чего я не вижу? – Mohan

1

Попробуйте это решение:

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

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и/или почему оно решает проблему, улучшит долгосрочную ценность ответа. –

+1

Кроме того, на первый взгляд это похоже на копию-вставку из другого ответа (теперь я вижу разницу). Возможно, было бы полезно отметить, почему другой ответ не сработал для вас и почему вы внесли изменения, которые вы сделали. –