Java Hibernate hql/条件结果包含集合

Java Hibernate hql/条件结果包含集合,java,hibernate,hql,hibernate-criteria,Java,Hibernate,Hql,Hibernate 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&l

我有两个实体:

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<Photo> photos;
   // other fields and getters/setters
}
还尝试了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-请求处理失败;嵌套异常是 org.springframework.orm.hibernate4.HibernateSystemException: 调用属性的setter时发生IllegalArgumentException [com.memories.dto.UserDTO.photos(预期类型=java.util.List)]; target=[com.memories.dto.UserDTO。photos@4e162869],物业价值= [ com.memories.dto.UserDTO.photos的setter;嵌套异常为 调用属性的setter时发生IllegalArgumentException [com.memories.dto.UserDTO.photos](预期类型=java.util.List)]; target=[com.memories.dto.UserDTO。photos@4e162869],物业价值= [


我认为使用上面的代码,您所要做的就是将结果直接分配给列表,它应该可以轻松地工作

List<User> userList = yourCriteria.list();
List userList=yourCriteria.List();

所以,我没有找到最好的解决方案,但是

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

List<User> list = getCurrentSession()
                .createQuery("from USer as u where u.login LIKE :login")
                .setString("login", login)
                .list();
List List=getCurrentSession()
.createQuery(“从用户作为u,其中u.login类似:login”)
.setString(“登录”,登录)
.list();
接下来,我们在实体用户方法中声明如下,它将
List
转换为
List

公共列表getPhotosURL(){
List url=newarraylist(photos.size());
(照片p:照片)
add(p.getUrl());
返回URL;
}
最后一步是硬编码创建DTO bean:

List<UserDTO> users = new ArrayList<UserDTO>(list.size());
for (User u : list) {
    users.add(new UserDTO(u.id, u.getPhotosUrls));
List users=newarraylist(List.size());
用于(用户u:列表){
添加(新的UserDTO(u.id,u.getPhotosURL));
当然,您必须具有
UserDTO(长id,列表URL)
构造函数。
如果有人能找到更好的解决方案,请写在这里:)

@DavidLevesque,是的,当然,如果我尝试
list.get(0)。toString()
-将抛出java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为com.dto,UserDTO这是因为您的dto有一个字符串列表。基本问题在于您的转换。您应该实际将结果转换为User而不是UserDTO,并编写一个实用程序方法将User转换为UserDTO。当hibernate尝试将结果转换为UserDTO时,它将期望我试着用一个
字符串照片来代替
列表照片
。我对答案进行了编辑,以反映同样的情况。谢谢,我问这个问题是因为我想知道更好的解决方案,但事实证明是这样。当我搜索变体时,我认为hibernate本身可以将数据从bd转换为实体bean。我认为我可以使用hibernate特性可以转换为dto类。
List<User> list = getCurrentSession()
                .createQuery("from USer as u where u.login LIKE :login")
                .setString("login", login)
                .list();
public List<String> getPhotosUrls() {
    List<String> urls = new ArrayList<String>(photos.size());
    for (Photo p : photos)
        urls.add(p.getUrl()));
    return urls;
}
List<UserDTO> users = new ArrayList<UserDTO>(list.size());
for (User u : list) {
    users.add(new UserDTO(u.id, u.getPhotosUrls));