comment faire pour retourner la Carte<Key, Value> avec HQL
j'ai une table
Autorisation:
- id
- nom
- desc
ce que je suis en train de faire maintenant
est de faire une requête qui retourne un objet d'autorisation puis mettre les valeurs de la carte par programme
1 - Mais je me demandais si il est possible de faire un HQL (ou natif sql si possible) pour sélectionner le permission_id, permission_name et de les renvoyer dans une carte.
2 - est-il possible de retourner la carte dans un à plusieurs " de la relation au lieu de la liste suivante ou un ensemble
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") })
private List<Permission> permissions = new ArrayList<Permission>(0);
est-il possible d'avoir quelque chose comme:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") })
private Map<String,String> permissions = new ArrayList<String,String>(0);
où les deux chaînes sont permission_id, permission_name.
Vous devez vous connecter pour publier un commentaire.
Utiliser le
select new map
syntaxe dans les requêtes HQL pour aller chercher les résultats de chaque ligne dans unMap
. Jetez un oeil à la question suivante, qui traite de la question: Comment extraire les hibernate résultat de la requête en tant que tableau associatif de la liste ou table de hachage.Par exemple, le HQL suivante:
select new map(perm.id as pid, perm.name as pname) from Permission perm
sera de retour d'uneList
deMap
s, chacun avec les touches "pid" et "pname".Il n'est pas possible de mapper une association à une
Map<String, String>
. Il est possible de déterminer la clé de la Carte d'une colonne avec la@MapKeyColumn
annotation dans l'association. Voir à cette question, qui traite également de la question, par exemple: JPA 2.0 Hibernate @OneToMany + @MapKeyJoinColumn. Ici est un autre exemple.select new map
HQL déclaration est une liste de cartes, une pour chaque résultat, dans lequel les touches sont les alias et les valeurs les valeurs de la colonne. Si vous souhaitez obtenir une carte<permissionId, permissionName>, @DonRoby suggestion surResultTransformer
peut-être plus en adéquation avec ce que vous essayez d'atteindre.@MapKeyColumn
. Si c'est le mapping de l'entité, vous devez utiliser@MapKeyJoinColumn
. La valeur de la Chaîne de lapermission_id
champ dans laPermission
entité.Map
la clé ne peut pas être dupliqués par la nature.@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") }) @MapKeyJoinColumn(name = "display_name") private Map<String, Permission> permissions = new HashMap<String, Permission>( 0);
j'ai eu une exception, lorsque la Permission est mappé l'entité.null index column for collection: com.myApp.PermissionCategory.permissions; nested exception is org.hibernate.HibernateException: null index column for collection: com.spring.sample.domain.PermissionCategory.permissions
@MapKeyColumn
au lieu de@MapKeyJoinColumn
?essayer comme cela,
ses posible avec Resulttransformer
En JPA 2.0 (dont les versions les plus récentes de la mise en veille prolongée), vous pouvez mapper les collections de primitives à l'aide d'un
@ElementCollection
annotation.De quelques échantillons de ces mappages de voir les collections hibernate docs.
Si vous n'êtes pas en train de cartographie dans cette voie mais que vous souhaitez créer une carte à l'aide soit HQL ou à l'un des Critères de requête, vous pouvez créer un ResultTransformer pour créer une carte à partir de l'ensemble de résultats renvoyés.
À en juger par Xavi réponse, je suppose qu'il est également en charge dans les requêtes HQL pour la création d'une carte sans l'aide d'un transformateur.
Transmet la requête à la suite de la méthode.