webentwicklung-frage-antwort-db.com.de

so geben Sie Map <Key, Value> mit HQL zurück

ich habe einen Tisch

Genehmigung:

  • ich würde
  • name
  • desc

was ich gerade mache soll eine Abfrage machen, die ein Berechtigungsobjekt zurückgibt, und dann die Werte programmgesteuert in die Map einfügen 

1- Aber ich habe mich gefragt, ob es möglich ist, eine HQL (oder eine native SQL, wenn nicht möglich) zu erstellen, um die permission_id, permission_name auszuwählen und sie in einer Karte zurückzugeben.

2- Ist es möglich, die Karte in einer oder mehreren Beziehungen anstelle der folgenden Liste oder Menge zurückzugeben

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

ist es möglich etwas zu haben:

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

die beiden Zeichenfolgen sind permission_id, permission_name.

31
fresh_dev
  1. Verwenden Sie die select new map-Syntax in HQL, um die Ergebnisse jeder Zeile in einer Map abzurufen. Werfen Sie einen Blick auf die folgende Frage, die sich mit dem Problem befasst: Abrufen des Hibernate-Abfrageergebnisses als assoziatives Array von Liste oder Hashmap ..__ Zum Beispiel gibt der folgende HQL: select new map(perm.id as pid, perm.name as pname) from Permission perm eine List von Maps zurück einer mit den Schlüsseln "pid" und "pname".

  2. Es ist nicht möglich, eine Zuordnung einem Map<String, String> zuzuordnen. Es ist möglich, den Schlüssel der Map einer Spalte mit der Annotation @MapKeyColumn in der Zuordnung zuzuordnen. Sehen Sie sich diese Frage an, die auch das Problem anspricht, für ein Beispiel: JPA 2.0 Hibernate @OneToMany + @MapKeyJoinColumn . Hier ist ein anderes Beispiel. 


@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

versuche es so,

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- Aber ich habe mich gefragt, ob es möglich ist, ein HQL (oder ein natives SQL, wenn es nicht möglich ist) zu erstellen, um die Berechtigungs-ID, den Berechtigungsnamen und .__ auszuwählen. bringe sie in eine Karte zurück.

es ist mit Resulttransformer möglich

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

In JPA 2.0 (die neuesten Versionen der Hibernate-Unterstützung) können Sie Sammlungen von Grundelementen mithilfe einer @ElementCollection-Annotation zuordnen.

Für einige Beispiele solcher Zuordnungen siehe die Hibernate-Sammlungen docs .

Wenn Sie sie nicht auf diese Weise abbilden, aber eine Map entweder mit HQL oder einer Kriterienabfrage erstellen möchten, können Sie einen ResultTransformer erstellen, um eine Map aus der zurückgegebenen Ergebnismenge zu erstellen.

Nach der Antwort von Xavi, denke ich, gibt es in HQL auch Unterstützung für das Erstellen einer Karte ohne Verwendung eines Transformators.

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

Übergeben Sie die Abfrage an die folgende Methode.

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