2010-10-26 8 views
1

J'ai un demandeur de modèle assez grand:JPA typées Requêtes de recherche

public class Applicant{ 
private Long id 
private String name; 
... 
... 
} 

Pour remplir une liste de sélection, je besoin d'une liste de (id, nom) tuples et j'utiliser cette requête de recherche:

public List getNames() { 
    Query query = em.createQuery("select a.id, a.name from Applicant a"); 
    return query.getResultList(); 

} 

Cependant, j'obtiens une liste d'Object [] et je ne veux pas vraiment les convertir dans la couche de gestion aux types correspondants (Long et String). Quelle est la meilleure façon d'aborder cela? Dois-je parcourir la liste et manuellement faire la conversion de type avant de le retourner? Ou devrais-je faire une classe d'aide:

public class ApplicantTuple{ 
public Long id 
public String name; 

public Application(Long id, String name) { 
    ... 
} 

} 

et une requête de recherche:

Query query = em.createQuery("select NEW my.model.ApplicantTuple(a.id, a.name) from Applicant a"); 

Ou est-il une meilleure façon de saisir des requêtes de recherche?

Répondre

2

Puisque vous êtes apparemment en utilisant JPA2, utilisez les méthodes typées:

public List<Applicant> getApplicants() { 
    TypedQuery<Applicant> query = em.createQuery(
     "select a.id, a.name from Applicant a", 
     Applicant.class 
    ); 
    return query.getResultList(); 
} 

Ensuite, il suffit d'utiliser les objets:

for(Applicant app: getApplicants()){ 
    selectionList.populate(app.getName(), app.getId()); 
} 
+0

Qu'est-ce qui se passe avec les autres champs de l'objet demandeur? Ils ne sont pas récupérés? Et est-ce possible quand j'utilise join et demande des champs de deux tables/entités? –

+0

Oui, les autres champs sont récupérés, sauf s'ils sont configurés paresseux. –

+0

Cependant, cela rend le jeu de résultats inutilement volumineux, n'est-ce pas? –

Questions connexes