web-dev-qa-db-fra.com

comment renvoyer la carte <clé, valeur> avec HQL

j'ai une table

Autorisation :

  • identifiant
  • prénom
  • desc

ce que je fais en ce moment est de faire une requête qui retourne un objet d'autorisation puis mettre les valeurs dans la carte par programme 

1- Mais je me demandais s'il était possible de créer un HQL (ou un SQL natif si ce n’était pas possible) pour sélectionner le permission_id , permission_name et les retourner dans une carte.

2- Est-il possible de renvoyer la carte dans une relation un à plusieurs au lieu de la liste suivante ou définie

@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 .

31
fresh_dev
  1. Utilisez la syntaxe select new map dans HQL pour extraire les résultats de chaque ligne dans un fichier Map. Examinez la question suivante, qui répond au problème: Comment extraire le résultat d'une requête hibernate sous forme de tableau associatif de liste ou de hashmap . Par exemple, le HQL suivant: select new map(perm.id as pid, perm.name as pname) from Permission perm renvoie un List de Maps, chacun avec les clés "pid" et "pname".

  2. Il n'est pas possible de mapper une association sur un Map<String, String>. Il est possible de mapper la clé de la carte sur une colonne avec l'annotation @MapKeyColumn dans l'association. Voir cette question, qui aborde également le problème, pour un exemple: JPA 2.0 Hibernate @OneToMany + @MapKeyJoinColumn . Ici est un autre exemple. 


@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "perm_cat_map", 
    joinColumns = { @JoinColumn(name = "perm_cat_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "permission_id") })
@MapKeyColumn(name="permission_id")
private Map<String, Permission> permissions = new HashMap<String,Permission>(0);
28
Xavi López

essayez comme ça,

Session session = sessionFactory.getCurrentSession();
String HQL_QUERY = "select new map(user.id as id, user.firstName as fullName) from User user";        
List<Map<String,String>> usersList = session.createQuery(HQL_QUERY).list(); 
15
mathi

1- Mais je me demandais s'il était possible de créer un HQL (ou un sql .__ natif si ce n’était pas possible) pour sélectionner l’autorisation permission_id, permission_name et retournez-les dans une carte.

sa posible avec Resulttransformer

String queryString="select id, name from Permission ";
List<List<Object>> permission= session.createQuery(queryString)
      .setResultTransformer(Transformers.TO_LIST).list();
//now you just expect two columns 
HashMap<Integer,String> map= new HashMap<Integer,String>();
for(List<Object> x: permission){ 
     map.put((Integer)x.get(0),(String)x.get(1))
}
7
osdamv

Dans JPA 2.0 (versions récentes prises en charge par Hibernate), vous pouvez mapper des collections de primitives à l'aide d'une annotation @ElementCollection.

Pour quelques exemples de tels mappages, voir the hibernate Collections Docs .

Si vous ne le mappez pas de cette manière mais souhaitez créer une mappe à l'aide de HQL ou d'une requête de critères, vous pouvez créer un ResultTransformer pour créer une mappe à partir du jeu de résultats renvoyé.

À en juger par la réponse de Xavi, je suppose que HQL permet également de créer une carte sans utiliser de transformateur.

4
Don Roby
String sqlQuery="select userId,name,dob from user"

Passez la requête à la méthode suivante.

public List<Map<String,Object>> getDataListBySQL(final String sql, final Long adId){

    List<Map<String,Object>> list=(List<Map<String,Object>>)getHibernateTemplate().executeFind(new HibernateCallback() {
        public Object doInHibernate(Session session) throws HibernateException,SQLException {
            Query query=session.createSQLQuery(sql);
            query.setParameter("adId", adId);               
            return query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
        }
    }); 
    return list;
}

Iterate this list in this way-
for(int i=0;i<list.size();i++){

        Map<String,Object> map=list.get(i);

        System.out.println(map.get("userId"));
        System.out.println(map.get("name"));
    }
1
pintu