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