java 判断 子集_java – 获取集合子集的策略

我有一个场景,我的应用程序可以访问有限时间窗口的会话,在此期间它必须从数据库中获取数据到内存中,然后只使用内存中的数据来处理请求.

数据模型是一个简单的一对多关联,例如:

现在假设汽车和卡车计数数据存在了几年,这远远超过了内存.此外,我真的只对过去3个月加载车数非常感兴趣.

我的问题是,使用hibernate加载这些数据的最佳方法是:

> road.getCarCountMap()仅返回过去3个月中车辆计数的集合(可能为空)

>我最终得到一些需要很长时间才能处理的疯狂笛卡尔产品

>关闭会话后,不会抛出LazyInitializationExceptions

我尝试过的一些事情是:

1.使carCountMap集合急切并在映射上指定where属性,例如:

< map name =“carCountMap”fetch =“subselect”lazy =“false”其中=“time_oid> 1000”>

(对应于truckCountMap)

这最符合我想要的集合语义,但不幸的是它迫使我硬编码一个值,所以我不能真正参考过去3个月. time_oid每天增加1.

2.将map定义为lazy并使用hql查询手动连接3个表:

from Road r

left outer join fetch r.carCountMap ccm

left outer join fetch r.truckCoutnMap tcm

where (ccm.time.oid > :startDate)

or (tcm.time.oid > :startDate)

这样的问题是结果查询返回数百万行,而它应该是10k道路*每月4次测量(每周)* 3个月= ~120k.这个查询在大约一个小时内完成,这很荒谬,因为方法#1(在我关注的情况下加载完全相同的数据)在3分钟内完成.

3.将地图定义为延迟并首先使用条件加载道路,然后运行其他查询以填充集合

List roadList = session.createCriteria(Road.class).list();

session.getNamedQuery("fetchCcm").setLong("startDate", startDate).list();

session.getNamedQuery("fetchTcm").setLong("startDate", startDate).list();

return roadList;

这会触发正确的查询,但检索到的汽车和卡车计数不会附加到roadList中的Road对象.所以当我尝试访问任何Road对象的计数时,我得到一个LazyInitializationException.

4.将地图定义为惰性,使用criteria.list()加载所有道路,迭代过去3个月内的所有测量日期,以强制加载这些值.

我还没有尝试过,因为它听起来很笨重,我不相信它会摆脱LazyInitializationException

>我遇到过这些方法遇到的问题是否有任何变通方法?

>是否有更好的方法?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值