2012-03-07 26 views
7

Tôi muốn truy vấn Tiêu chí khởi tạo lớp DTO bằng cách sử dụng AliasToBeanResultTransformer. Mục tiêu là tạo danh sách phân trang trọng lượng nhẹ với ID để có thêm hành động cho trang chủ. Thao tác này yêu cầu truy vấn loại báo cáo.AliasToBeanResultTransformer (MyDTO.class) không thể khởi tạo 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(); 

Điều này không thể khởi tạo lớp DTO của tôi. ProfileDTO có một constructor phù hợp:

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

Và truy vấn hoạt động khi tôi xây dựng ProfileDTO đối tượng bằng tay với các hàng kết quả

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

workaround của tôi là làm việc tốt, nhưng có vẻ như không cần thiết. Tôi đang làm gì sai?

Trả lời

7

AliasToBeanResultTransformer sử dụng trình cài đặt để điền DTO. Nếu bạn muốn sử dụng một hàm tạo, để tạo cá thể bean của bạn, bạn cần sử dụng một AliasToBeanConstructorResultTransformer.

DTO của bạn dường như có thiết lập cho tất cả các thành phần của bộ dữ liệu, ngoại trừ lastName. Có lẽ đây là vấn đề.

Điều đó nói rằng, mã của bạn là đơn giản, dễ bảo trì và có thể tái cấu trúc. Nó sẽ không được refactorable với một AliasToBeanResultTransformer. Tôi thường thích tạo bản thân DTO của mình, giống như bạn đã làm.

+0

Cảm ơn JB. Tôi sẽ ngừng lo lắng và ôm lấy DIY. Như bạn nói, nó hoạt động tốt như vậy. – carbontax

+0

bạn có thể đặt một ví dụ không? –

0

thử với điều này:

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(); 
     } 
    } 
} 
Các vấn đề liên quan