Я бы хотел, чтобы запрос Criteria создавал экземпляр класса DTO с помощью AliasToBeanResultTransformer. Цель состоит в том, чтобы создать облегченный постраничный список с идентификаторами для дальнейших действий для домашней страницы. Это требует запроса типа отчета.
Criteria crit = session.createCriteria(Profile.class);
crit.createAlias("personalData", "pd");
crit.createAlias("emails", "e");
crit.createAlias("telephones", "t");
ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("id").as( "id"));
properties.add(Projections.property("pd.lastName").as("lastName"));
properties.add(Projections.property("pd.fullName").as("fullName"));
properties.add(Projections.property("e.emailAddress").as("email"));
properties.add(Projections.property("t.phoneNumber").as("phone"));
crit.setProjection(properties);
crit.setResultTransformer(new AliasToBeanResultTransformer(ProfileDTO.class));
profiles = crit.list();
Это не в состоянии создать экземпляр моего класса DTO. ProfileDTO имеет соответствующий конструктор:
public ProfileDTO(Long id, String lastName, String fullName, String email,
String phone) {
this(id,fullName);
this.lastName = lastName;
this.email = email;
this.phone = phone;
}
И запрос работает, когда я вручную создаю объекты ProfileDTO со строками результата
List<Object[]> rows = crit.list();
for ( Object[] row: rows ) {
ProfileDTO dto = new ProfileDTO();
dto.setId((Long)row[0]);
dto.setLastName((String)row[1]);
dto.setFullName((String)row[2]);
dto.setEmail((String)row[3]);
dto.setPhone((String)row[4]);
profiles.add(dto);
}
Мой обходной путь работает нормально, но он кажется ненужным. Что я делаю не так?