ich habe einen Tisch
Genehmigung:
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.
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 Map
s zurück einer mit den Schlüsseln "pid" und "pname".
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);
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();
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))
}
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.
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"));
}