AliasToBeanResultTransformer (MyDTO.class) не может создать экземпляр MyDTO - PullRequest
7 голосов
/ 07 марта 2012

Я бы хотел, чтобы запрос 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);
        }

Мой обходной путь работает нормально, но он кажется ненужным. Что я делаю не так?

Ответы [ 2 ]

7 голосов
/ 07 марта 2012

AliasToBeanResultTransformer использует установщики для заполнения DTO.Если вы хотите использовать конструктор, для создания вашего экземпляра компонента вам нужно использовать AliasToBeanConstructorResultTransformer .

В вашем DTO, похоже, имеется установщик для всех элементов кортежа, кромеФамилия.Может быть, в этом проблема.

Тем не менее, ваш код прост, прост в обслуживании и реорганизуем.Это не будет рефакторингом с AliasToBeanResultTransformer.Я обычно предпочитаю создавать собственные DTO, как и вы.

0 голосов
/ 11 июля 2017

попробуйте с этим:

public List<ProfileDTO> getProfiles() throws HibernateException 
{       
    try { 

        session = HibernateUtil.getSessionFactory().openSession();

        Criteria criteria = session.createCriteria(Profile.class);

        criteria.createAlias("personalData", "pd");
        criteria.createAlias("emails", "e");
        criteria.createAlias("telephones", "t");

        criteria.setProjection(Projections.projectionList()
                    .add(Projections.property("id").as( "id"))
                    .add(Projections.property("pd.lastName").as("lastName"))
                    .add(Projections.property("pd.fullName").as("fullName"))
                    .add(Projections.property("e.emailAddress").as("email"))
                    .add(Projections.property("t.phoneNumber").as("phone"))
        );

        criteria.setResultTransformer(Transformers.aliasToBean(ProfileDTO.class));

        return (List<ProfileDTO>)criteria.list();

    } catch (HibernateException he){
        he.printStackTrace();
        throw he; 
    } finally {
         if(session.isOpen()){
             session.close();
         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...