Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用Hibernate,如何查询表并返回键值对id为>;的hashmap;名称_Sql_Hibernate_Hql - Fatal编程技术网

Sql 使用Hibernate,如何查询表并返回键值对id为>;的hashmap;名称

Sql 使用Hibernate,如何查询表并返回键值对id为>;的hashmap;名称,sql,hibernate,hql,Sql,Hibernate,Hql,我有这张桌子: table name : Account Fields : id (varchar), name(varchar), other fields... 我想用hibernate机制查询这个表(使用第二个缓存级别)。hibernate查询的结果必须是一个哈希映射,其中键是字段id,值是字段名 如何使用HQL编写它 若我使用map,我只能使用alias,若我对一个对象使用构造函数,我必须将结果转换为hashmap,这非常耗时 Example : Id | name | other

我有这张桌子:

table name : Account
Fields : id (varchar), name(varchar), other fields...
我想用hibernate机制查询这个表(使用第二个缓存级别)。hibernate查询的结果必须是一个哈希映射,其中键是字段id,值是字段名

如何使用HQL编写它

若我使用map,我只能使用alias,若我对一个对象使用构造函数,我必须将结果转换为hashmap,这非常耗时

Example : 
Id | name | other fields
1 Jerome ...
2 Steve ...
3 Nick ...
查询结果必须是hashmap:

1>Jerome
2>Steve
3>Nick

谢谢

我想你能找到的最接近的方法就是使用这个查询:

select id, name from Account
这将为您提供两个长度数组的结果集。您必须手动构建地图,如下所示:

for(Object[] row : rs) {
    map.put(row[0], row[1]);
}

请注意,这将在很大程度上忽略第二级缓存,并转换为SQL查询。

假设当前帐户没有任何将加载的非惰性关联,以下是您将获得的最佳性能:

List<Account> accounts = (List) session.createQuery("from Account").list();
for (Account account : accounts) map.put(account.getID(), account.getName());
List accounts=(List)session.createQuery(“from Account”).List();
for(Account:accounts)map.put(Account.getID(),Account.getName());
这可能很“耗时”,但Hibernate并不能神奇地避免将返回的每一行放入映射的步骤


与另一个答案不同,这应该得益于二级缓存。

Hibernate的默认实体模式是EntityMode.POJO

您可以使用EntityMode.MAP实体模式以映射格式检索查询输出。

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

    }
inti;
int j;
Object=null;
对于(i=0;i对于(j=0;jintead)使用默认实体名称,可以将实体名称应用于hbm.xml文件

比如说


使用这个方法,hibernate会给出键/值对,这意味着返回映射。

这个问题很老了,但这可能仍然有助于其他人。 现在,您可以使用HQL通过hibernate返回地图。 使用类似以下内容:

select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n ) from Cat cat
从hibernate文档:

大约1年1/2,我更新了我接受的答案!这正是我被搜索到的。虽然有点晚了,但这是一个有用的信息!@JeromeCance,7年后,我在这里想为什么这是接受的答案…如何将ID映射到名称?这只是将别名映射到选定的值。