2017-02-15 1 views
1

J'ai deux classesComment renvoyer un type spécifique au lieu de la liste <Object[]> dans les critères Hibernate?

@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; 
} 

Donc, il y a aussi deux tables dans la base de données: l'utilisateur et l'article. J'essaie d'obtenir des données en utilisant des critères:

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

Mais la liste n'est pas retourné List<article>, c'est un List<Object> ARTICLE contient et USER, et je ne sais pas comment obtenir les données de la liste ARTICLE. si je mets FetchType.LAZY, la liste retournée sera List<article> sans données utilisateur, mais je dois aussi les données utilisateur ...

Répondre

3

Les critères Hibernate méthode de classe list() retour d'une liste brute. Donc, si vous essayez de lancer , vous obtenez un avertissement non vérifié.

Mais la liste retournée est pas la liste, il est une liste contient ARTICLE et USER

Il ne contient pas à la fois l'article et l'utilisateur, il ne contient que le type que vous avez passé lorsque vous créez les critères. Dans ce cas:

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

La liste retournée contiendra des objets article.

Vous pouvez obtenir une liste de l'article de différentes façons:

Le plus facile:

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

Ou vous pouvez copier les valeurs dans une autre liste:

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

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

Regardez ce post: What is the "proper" way to cast Hibernate Query.list() to List<Type>?

Quoi qu'il en soit, les noms de classe doivent commencer par une majuscule caractère pour les conventions de nommage Java. article -> Article, utilisateur -> Utilisateur

+0

Merci beaucoup pour votre réponse! J'ai fait un test, cela fonctionne comme ceci: Liste

articles = new ArrayList
(); \t \t \t pour (Object [] objet: liste) { \t \t \t \t articles.add ((article objet) [1]); \t \t \t} –

0

Utilisez Projection ou ResultSetTransformer:

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

c'est facile de google.