如何使用HQL </key,>返回Map <key,value =“”>

时间:2011-10-24 13:54:31

标签: hibernate hql hibernate-mapping

我有一张桌子

权限

  • ID
  • 名称
  • 递减

我现在正在做什么 是创建一个返回权限对象的查询,然后以编程方式将值放在地图中

1-但我想知道是否可以制作HQL(如果不可能,则使用原生sql)来选择 permission_id permission_name 并在地图中返回它们

2-是否可以以一对多的关系返回地图,而不是按照列表或设置

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

两个字符串为 permission_id permission_name

5 个答案:

答案 0 :(得分:29)

  1. 使用HQL中的select new map语法来获取Map中每行的结果。请查看以下问题,以解决此问题:How to fetch hibernate query result as associative array of list or hashmap。 例如,以下HQL:select new map(perm.id as pid, perm.name as pname) from Permission perm将返回ListMap个,每个都带有“pid”和“pname”键。

  2. 无法将关联映射到Map<String, String>。可以将Map的键映射到关联中具有@MapKeyColumn注释的列。请参阅此问题,该问题也解决了该问题,例如:JPA 2.0 Hibernate @OneToMany + @MapKeyJoinColumnHere是另一个例子。

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

答案 1 :(得分:16)

尝试这样,

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

答案 2 :(得分:7)

  

1-但我想知道是否可以制作HQL(或原生sql)   如果不可能)选择permission_id,permission_name和   将它们放回地图中。

它与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))
}

答案 3 :(得分:4)

在JPA 2.0(最新版本的Hibernate支持)中,您可以使用@ElementCollection注释来映射基元集合。

对于此类映射的一些示例,请参阅the hibernate collections docs

如果您实际上没有以这种方式映射它,但想要使用HQL或Criteria查询创建映射,则可以创建ResultTransformer以从返回的结果集创建映射。

从Xavi的答案来看,我猜HQL还支持在不使用变压器的情况下创建地图。

答案 4 :(得分:1)

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"));
    }