我想要使用AliasToBeanResultTransformer实例化DTO类的Criteria查询。目的是生成带有ID的轻量页面列表,以对主页进行进一步操作。这需要报告类型查询。
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); }
我的解决方法工作正常,但似乎没有必要。我究竟做错了什么?
该AliasToBeanResultTransformer使用setter方法来填充DTO。如果要使用构造函数来创建bean实例,则需要使用AliasToBeanConstructorResultTransformer。
您的DTO似乎对元组的所有元素都有设置器,除了lastName之外。也许这就是问题所在。
也就是说,您的代码简单,易于维护且可重构。使用AliasToBeanResultTransformer无法将其重构。我通常喜欢像您一样自己实例化我的DTO。