fre*_*dev 34 hibernate hql hibernate-mapping
我有一张桌子
许可:
我现在正在做的是创建一个返回权限对象的查询,然后以编程方式将值放在地图中
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
使用select new mapHQL中的语法来获取a中每行的结果Map.看看下面的问题,解决了这个问题:如何将hibernate查询结果作为列表或hashmap的关联数组获取.例如,下面的HQL:select new map(perm.id as pid, perm.name as pname) from Permission perm将返回List的MapS,每一个与键"PID"和"PNAME".
无法将关联映射到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);
小智 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)
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)
在 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)
| 归档时间: |
|
| 查看次数: |
78067 次 |
| 最近记录: |