2009-06-25 4 views
2

Je voudrais écrire une requête hql en utilisant une instanciation dynamique avec une liste comme l'un de ses paramètres.Hibernate instanciations dynamiques avec des collections, est-ce possible?

Exemple simplifié:

Une requête HQL avec une instanciation dynamique:

select new x.y.UserDto(u.name, u.contacts) from User u where u.xyz=:param1 ... 

et mon constructeur de la classe DTO est:

public class UserDto { 
    private String name; 
    private List contacts; 

    public UserDto(String name, List contacts) { 
     this.name = name; 
     this.contacts = contacts; 
    } 
    ... 
} 

Et la mise en correspondance de l'entité:

public class User { 
    @olumn(name="NAME") 
    String name; 

    @ManyToMany(targetEntity= Contacts.class, fetch = FetchType.EAGER) 
    @JoinTable(name="USER_DEPARTMENT_CONTACTS", 
      [email protected](name="DEPARTMENT_ID"), 
      [email protected](name="USER_ID")) 
    private List<Contacts> contacts; 

    ...  
} 

Donc, comme vous pouvez le voir, tout ce que je veux, c'est créer un nouvel objet qui a des propriétés et des collections d'une entité.

Je peux comprendre qu'Hibernate ait besoin d'une ou de plusieurs requêtes pour y parvenir car cela générerait plusieurs lignes de résultat pour chaque entité.

Est-ce que quelqu'un sait s'il est possible de créer un nouvel objet qui est une combinaison de propriétés et de collections?

Répondre

3

Désolé mais ce n'est pas possible. Selon JPA,

Le type du résultat de la requête spécifiée par la clause SELECT d'une requête est un type de schéma abstrait ENTITÉ , Un type ÉTAT DE CHAMP - PAS UNE COLLECTION -, le résultat de une fonction d'agrégat, le résultat d'une opération de construction , OU QUELQUE SÉQUENCE DE CES.

Vous pouvez utiliser ce qui suit à la place:

select DISTINCT new x.y.UserDto(u) from User u LEFT JOIN FETCH u.contacts 

Alors, de cette façon que vous auriez les utilisateurs avec vos contacts les cheveux

Questions connexes