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
构造函数。 如果有人会找到更好的解决方案,请写在这里:)