我有一张桌子
权限:
我现在正在做什么 是创建一个返回权限对象的查询,然后以编程方式将值放在地图中
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 。
答案 0 :(得分:29)
使用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
将返回List
个Map
个,每个都带有“pid”和“pname”键。
无法将关联映射到Map<String, String>
。可以将Map的键映射到关联中具有@MapKeyColumn
注释的列。请参阅此问题,该问题也解决了该问题,例如:JPA 2.0 Hibernate @OneToMany + @MapKeyJoinColumn。 Here是另一个例子。
@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"));
}