我有这张桌子:
table name : Account
Fields : id (varchar), name(varchar), other fields...
我想用hibernate机制查询这个表(使用第二个缓存级别)。 hibernate查询的结果必须是哈希映射,其中键是字段id,值是字段名称。
如何用HQL编写它?
如果我使用map,我只能使用别名,如果我使用带有对象的构造函数,我必须将结果转换为hashmap,这很费时。
Example :
Id | name | other fields
1 Jerome ...
2 Steve ...
3 Nick ...
查询的结果必须是一个hashmap:
1>Jerome
2>Steve
3>Nick
感谢
答案 0 :(得分:12)
这个问题很老,但这可能仍然有助于其他人。 您现在可以使用HQL返回带有hibernate的映射。 使用这样的东西:
select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n ) from Cat cat
来自hibernate docs: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select
答案 1 :(得分:5)
我认为最接近的是使用此查询:
select id, name from Account
它将为您提供两个长度数组的结果集。您必须手动构建地图,如下所示:
for(Object[] row : rs) {
map.put(row[0], row[1]);
}
请注意,这将在很大程度上忽略二级缓存并转换为SQL查询。
答案 2 :(得分:3)
Hibernate的默认实体模式是EntityMode.POJO。
您可以使用EntityMode.MAP实体模式以Map格式检索查询输出。
答案 3 :(得分:0)
假设目前该帐户没有任何非加密的关联,那么以下是您将获得的最佳性能:
List<Account> accounts = (List) session.createQuery("from Account").list();
for (Account account : accounts) map.put(account.getID(), account.getName());
这可能是“耗时的”,但它并不像Hibernate可以以某种方式神奇地避免将每个返回的行放入地图的步骤。
与其他答案不同,这应该受益于二级缓存。
答案 4 :(得分:0)
... HIII
以下代码可能会对您有所帮助。
Query query = session.createQuery("select id, name from table");
List results = query.list();
在对象确实有效时显示结果:
int i;
int j;
Object object = null;
for (i = 0; i < results.size(); i++) {
System.out.println("-------");
Object[] obj = (Object[]) results.get(i);
for (j=0;j<obj.length;j++)
{
System.out.println(obj[j]);
}
System.out.println("-------");
}
编辑:您可以将结果对象用作地图并完成。
答案 5 :(得分:-1)
使用默认实体名称,您可以将实体名称应用于hbm.xml文件。
例如
使用它,hibernate给出键/值对,这意味着返回地图。