2017-02-15 58 views
1

我有两个类如何在Hibernate Criteria中返回特定类型而不是列表<Object[]>?

@Entity 
public class user implements Serializable{ 
... 
private Set<article> uploaded = new HashSet<article>(); 
... 
@OneToMany(mappedBy="uploader") 
public Set<article> getUploaded() { 
return uploaded; 
} 

@Entity 
public class article implements Serializable{ 
.... 
private user uploader; 
.... 
@ManyToOne 
public user getUploader() { 
    return uploader; 
} 

所以也存在两个表中的数据库:用户和文章。我尝试使用标准得到的数据:

tx = session.beginTransaction(); 
Criteria cr = session.createCriteria(article.class); 
... 
List<article> list = cr.list(); 

但返回的列表不是List<article>,这是一个List<Object>包含文章,USER,我不知道如何从列表中获取文章数据。如果我设置FetchType.Lazy,则返回的列表将是List<article>不含用户数据,但我也需要对用户数据...

回答

3

的标准休眠类list()方法返回一个列表原料。因此,如果您尝试投射 ,您会收到未经检查的警告。

但返回的列表中没有列出,这是一个列表包含文章,用户

它不包含这两种物品和用户,它仅包含当您创建的标准,你传递的类型。在这种情况下:

Criteria cr = session.createCriteria(article.class); 

返回的列表将包含文章对象。

你可以用不同的方式文章的列表:

最简单的一个:

//Cast the raw list, but this will give you an unchecked warning 
List<article> list = (List<article>) cr.list(); 

或者你可以在另一个列表中复制值:

List<Object> list = cr.list(); 
List<article> articles = new ArrayList<article>(); 

for(Object object : list) { 
    if(object instanceof article) { 
     articles.add((article) object); 
    } 
} 

看看这个岗位:What is the "proper" way to cast Hibernate Query.list() to List<Type>?

无论如何,类名称必须以大写用于java命名约定的字符。文章 - >条,用户 - >用户

+0

非常感谢您的回答!我做了一些测试,它的工作原理是这样的:名单

物品=新的ArrayList
(); \t \t \t为(对象[]对象:列表){ \t \t \t \t articles.add((物品)的对象[1]); \t \t \t} –

0

使用投影或ResultSetTransformer:

.setResultTransformer(Transformers.aliasToBean(article.class));

这很容易谷歌。

相关问题