如何使用HQL返回Map <Key,Value>

fre*_*dev 34 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);
Run Code Online (Sandbox Code Playgroud)

有可能有类似的东西:

@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);
Run Code Online (Sandbox Code Playgroud)

其中两个字符串是permission_id,permission_name.

Xav*_*ica 29

  1. 使用select new mapHQL中的语法来获取a中每行的结果Map.看看下面的问题,解决了这个问题:如何将hibernate查询结果作为列表或hashmap的关联数组获取.例如,下面的HQL:select new map(perm.id as pid, perm.name as pname) from Permission perm将返回ListMapS,每一个与键"PID"和"PNAME".

  2. 无法将关联映射到a Map<String, String>.可以将Map的键映射到具有@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);

  • 考虑到`select new map` HQL语句的返回是一个映射列表,每个结果一个,其中键是别名,值是列值.如果你想获得一个地图<permissionId,permissionName>,@ DonRoby关于`ResultTransformer`的建议可能会更符合你想要实现的目标. (2认同)

小智 17

试试这样,

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(); 
Run Code Online (Sandbox Code Playgroud)


osd*_*amv 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))
}
Run Code Online (Sandbox Code Playgroud)


Don*_*oby 5

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

有关此类映射的一些示例,请参阅hibernate 集合文档

如果您实际上并未以这种方式映射它,而是想使用 HQL 或 Criteria 查询创建映射,则可以创建ResultTransformer以根据返回的结果集创建映射。

从 Xavi 的回答来看,我猜 HQL 中也支持在不使用转换器的情况下创建地图。


小智 5

String sqlQuery="select userId,name,dob from user"
Run Code Online (Sandbox Code Playgroud)

将查询传递给以下方法。

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"));
    }
Run Code Online (Sandbox Code Playgroud)