在Hibernate中实体对象映射优化(临时表映射)

 

1.关于EntityManager的介绍,参考链接:https://www.jianshu.com/p/091360c47e6b

@PersistenceContext
private EntityManager em;

2.通过HibernateEntityManager获取Session对象,参考链接:https://blog.youkuaiyun.com/aibisoft/article/details/47999593

HibernateEntityManager hem = (HibernateEntityManager)em;

3.对象转换,参考链接:https://blog.youkuaiyun.com/taotaojs/article/details/79303901

(1)创建一个对象容器

/**
 * @ClassName AppLocationTimeBean
 * @Author 屈想顺
 * @Date 2018/12/12 19:54
 */
public class AppLocationTimeBean {
    /**
     * 送货记录ID
     */
    private Long recordId;
    /**
     * 发送定位次数
     */
    private Integer locationTime;

    /** get/set 略 */
}

(2)查询SQL★ sql字段别名必须和成员变量名保持一致(区分大小写)

String tempSql = "SELECT ri.record_id recordId, COUNT(al.id) locationTime FROM t_delivery_record_delivery_info ri " +
                " LEFT JOIN t_app_location al ON al.record_id = ri.record_id " +
                " GROUP BY ri.record_id";

(3)对象转换

Query query = hem.getSession().createSQLQuery(tempSql)
                .addScalar("recordId", StandardBasicTypes.LONG)
                .addScalar("locationTime", StandardBasicTypes.INTEGER)
                .setResultTransformer(Transformers.aliasToBean(AppLocationTimeBean.class));
        List<AppLocationTimeBean> list = query.list();

(4)对象处理,把ID作为Key,后面可以通过Key来获取这个对象

//创建HashMap并指定大小
Map<Long, Integer> timeMap = new HashMap(16);
list.forEach(t -> timeMap.put(t.getRecordId(), t.getLocationTime()));

至此,临时表对象获取就结束了。

应用:

如果把上述数据做关联查询,会消耗后台性能,这样先把这个对象取出来,避免了重复关联查询操作。只需要在查询的时候获取map的key,通过key来获取对象。如果对象有多个字段可以考虑用Google的guava multimap来处理对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值