web-dev-qa-db-ja.com

HQLでMap <Key、Value>を返す方法

私はテーブルを持っています

許可

  • id
  • デスク

私が今やっていることは、許可オブジェクトを返すクエリを作成し、プログラムでマップに値を入れることです

1-しかし、HQL(または不可能な場合はネイティブSQL)を作成してpermission_idpermission_nameを選択し、マップで返すことができるかどうか疑問に思っていました。

2-リストまたはセットをたどる代わりに、1対多の関係でマップを返すことは可能ですか?

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

次のようなものを持つことは可能ですか?

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

ここで、2つの文字列はpermission_idpermission_nameです。

33
fresh_dev
  1. HQLで_select new map_構文を使用して、Mapの各行の結果をフェッチします。この問題に対処する次の質問をご覧ください。 リストまたはハッシュマップの連想配列として休止状態クエリの結果を取得する方法 。たとえば、次のHQL:select new map(perm.id as pid, perm.name as pname) from Permission permListsのMapを返します。それぞれがキー「pid」と「pname」を持ちます。

  2. 関連付けを_Map<String, String>_にマップすることはできません。関連付けの _@MapKeyColumn_ アノテーションを使用して、マップのキーを列にマップすることができます。例については、この問題にも対処するこの質問を参照してください。 JPA 2.0 Hibernate @OneToMany + @MapKeyJoinColumnここ は別の例です。

 _
@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);
_ 
29
Xavi López

このようにしてみてください

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(); 
17
mathi

1-しかし、permission_id、permission_nameを選択してそれらをマップで返すためにHQL(または不可能な場合はネイティブSQL)を作成することが可能かどうか疑問に思っていました。

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

JPA 2.0(最新バージョンのHibernateがサポート)では、@ElementCollectionアノテーションを使用してプリミティブのコレクションをマップできます。

このようなマッピングのサンプルについては、 the hibernate collections docs をご覧ください。

この方法で実際にマッピングするのではなく、HQLクエリまたはCriteriaクエリを使用してマップを作成する場合は、 ResultTransformer を作成して、返された結果セットからマップを作成できます。

Xaviの答えから判断すると、HQLにはトランスフォーマーを使用せずにマップを作成するためのサポートもあると思います。

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

次のメソッドにクエリを渡します。

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