Hibernet5.2.2 Transformers.ALIAS_TO_ENTITY_MAP返回结果排序问题

文章讲述了在JPA查询中,如何通过重写ResultTransformer来确保返回的Map结果是有序的。具体做法是创建一个名为MyAliasedTupleSubsetResultTransformer的类,继承自AliasedTupleSubsetResultTransformer,并在transformTuple方法中使用LinkedHashMap保证顺序,然后在查询时设置这个自定义的ResultTransformer。
return query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).getResultList();

返回的map是无序的,查询HashMap和LinkedHashMap。

重写Transformer:

public class MyAliasedTupleSubsetResultTransformer extends AliasedTupleSubsetResultTransformer {

    public static final MyAliasedTupleSubsetResultTransformer INSTANCE = new MyAliasedTupleSubsetResultTransformer();

    /**
     * Disallow instantiation of AliasToEntityMapResultTransformer.
     */
    private MyAliasedTupleSubsetResultTransformer() {
    }

    @Override
    public Object transformTuple(Object[] tuple, String[] aliases) {
        LinkedHashMap 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;
    }

    @Override
    public boolean isTransformedValueATupleElement(String[] aliases, int tupleLength) {
        return false;
    }

    /**
     * Serialization hook for ensuring singleton uniqueing.
     *
     * @return The singleton instance : {@link #INSTANCE}
     */
    private Object readResolve() {
        return INSTANCE;
    }
}
将
Map result = new HashMap(tuple.length);

改为有序的

LinkedHashMap result = new LinkedHashMap(tuple.length);

在代码中使用:

return query.unwrap(NativeQueryImpl.class).setResultTransformer(MyAliasedTupleSubsetResultTransformer.INSTANCE).getResultList();

完毕!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值