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来处理对象。