2012-03-07 12 views
7

Chciałbym zapytanie Kryteria, aby utworzyć instancję klasy DTO przy użyciu AliasToBeanResultTransformer. Celem jest stworzenie listy stron o niskiej wadze z identyfikatorami do dalszych działań na stronie głównej. To wymaga zapytania typu raportowania.AliasToBeanResultTransformer (MyDTO.class) nie tworzy instancji MyDTO

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

Nie można utworzyć mojej klasy DTO. ProfileDTO ma konstruktora Dopasowanie:

public ProfileDTO(Long id, String lastName, String fullName, String email, 
     String phone) { 
    this(id,fullName); 
    this.lastName = lastName; 
    this.email = email; 
    this.phone = phone; 
} 

I kwerenda działa kiedy skonstruować ProfileDTO Przedmioty ręcznie z wierszy wynikowych

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

Moja obejście działa poprawnie, ale wydaje się zbędne. Co ja robię źle?

Odpowiedz

7

Urządzenie AliasToBeanResultTransformer stosuje setery do zapełniania DTO. Jeśli chcesz użyć konstruktora, aby utworzyć instancję komponentu bean, musisz użyć wartości AliasToBeanConstructorResultTransformer.

Twoje DTO wydaje się mieć setera dla wszystkich elementów krotki, z wyjątkiem lastName. Może to jest problem.

Powiedziawszy, twój kod jest prosty, łatwy w utrzymaniu i refaktoryzacji. Nie byłoby to możliwe do zrestrukturyzowania za pomocą AliasToBeanResultTransformer. Generalnie wolę tworzyć swoje DTO osobiście, tak jak ty.

+0

Thanks JB. Przestanę się martwić i obejmuję majsterkowanie. Jak mówisz, działa dobrze, jak jest. – carbontax

+0

czy możesz podać przykład? –

0

spróbować z tym:

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