1
Query query = this.getSession().createSQLQuery(sqlQuery);       
query.setResultTransformer(new AliasToEntityMapResultTransformer());

List results = query.list();

在上面的代码中,results包含 Map 的元素,我可以通过 Map 的键获取列名,但是如您所知,query.list()返回 HashMap 的元素,这就是为什么列名的排序不按顺序,我希望列名基于 sql -查询序列。

4

2 回答 2

2

这是一个非常古老的问题,但对于为什么变压器中还没有这样的东西有点令人烦恼。

使用转换器运行查询:

Query sqlQuery = session.createSQLQuery(sqlStatement);
sqlQuery.setResultTransformer(AliasToEntityLinkedMapResultTransformer.INSTANCE);

List results = query.list();

对于转换器,我扩展了 BasicTransformerAdapter,而不是 AliasToEntityMapResultTransformer。

import org.hibernate.transform.BasicTransformerAdapter

public class AliasToEntityLinkedMapResultTransformer extends BasicTransformerAdapter implements Serializable {
    public static final AliasToEntityLinkedMapResultTransformer INSTANCE = new AliasToEntityLinkedMapResultTransformer();

    private AliasToEntityLinkedMapResultTransformer() {

    }

    public Object transformTuple(Object[] tuple, String[] aliases) {
        Map result = new LinkedHashMap(tuple.length)
        for (int i = 0; i < tuple.length; i++) {
            String alias = aliases[i]
            if (alias != null) {
                result.put(alias, tuple[i])
            }
        }

        return result;
    }

    private Object readResolve() {
        return INSTANCE
    }

    public boolean equals(Object other) {
        return other != null && AliasToEntityLinkedMapResultTransformer.class.isInstance(other)
    }

    public int hashCode() {
        return getClass().getName().hashCode()
    }
}

没有什么革命性的或直截了当的,但它确实存在。

于 2015-09-15T21:21:59.377 回答
1

AliasToEntityLinkedMapResultTransformer以 的代码AliasToEntityMapResultTransformer为例,实现您自己的 ,但使用 aLinkedHashMap而不是 a HashMapLinkedHashMap保留插入顺序。

于 2012-09-05T10:09:45.990 回答