Hibernate hql / criteria结果包含集合

我有两个实体:

public class Photo { Long id; String url; @ManyToOne @JoinColumn(name ="user_id") User user; // other fields and getters/setters } 

第二个:

 public class User { Long id; @OneToMany(mappedBy = "user") private Collection photos; // other fields and getters/setters } 

我想要得到这个DTO:

 public class UserDTO { Long id; List photosUrls; } 

但我找不到合适的解决方案。 我写了下一个标准 – 通过登录找到有照片的用户:

 getCurrentSession().createCriteria(User.class, "user") .createAlias("user.photos", "photos") .setProjection(getUserProjection()) .add(Restrictions.eq("user.login",login)) .setResultTransformer(Transformers.aliasToBean(UserDTO.class)) .list(); // projection getUserProjection() { return Projections.projectionList() .add(Projections.property("user.id"), "id") .add(Projections.property("photos"), "url"); } 

也尝试使用HQL:

 getCurrentSession() .createQuery("select u.id, p.url " + " from User u inner join u.photos p " + " where u.login LIKE :login") .setString("login", login) .list(); 

但返回的结果是List类型但我需要List


更新:

HTTP状态500 – 请求处理失败; 嵌套exception是org.springframework.orm.hibernate4.HibernateSystemException:调用setter for property [com.memories.dto.UserDTO.photos(expected type = java.util.List)]时发生IllegalArgumentException; target = [com.memories.dto.UserDTO.photos@4e162869],属性值= [ http://sofzh.miximages.com/java/artworks-000031744302-0730nk-t500x500.jpg] com.memories.dto.UserDTO的setter。相片; 嵌套exception是在调用setter for property [com.memories.dto.UserDTO.photos]时发生的IllegalArgumentException(期望的类型= java.util.List)]; target = [com.memories.dto.UserDTO.photos@4e162869],property value = [ http://sofzh.miximages.com/java/artworks-000031744302-0730nk-t500x500.jpg]

我认为使用上面的代码,你所要做的就是将结果直接分配给List,它应该像微风一样工作。 这样的事情。

 List userList = yourCriteria.list(); 

所以,我发现不是最好的解决方案,但……

首先,需要获取实体列表用户:

 List list = getCurrentSession() .createQuery("from USer as u where u.login LIKE :login") .setString("login", login) .list(); 

接下来,我们在像这样的实体User方法中声明,将List转换为List

 public List getPhotosUrls() { List urls = new ArrayList(photos.size()); for (Photo p : photos) urls.add(p.getUrl())); return urls; } 

最后一步是硬编码创建DTO bean:

 List users = new ArrayList(list.size()); for (User u : list) { users.add(new UserDTO(u.id, u.getPhotosUrls)); 

当然,您必须拥有UserDTO(Long id, List urls)构造函数。 如果有人会找到更好的解决方案,请写在这里:)