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

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

现在假设汽车和卡车计数数据存在了几年,这远远超过了内存.此外,我真的只对过去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

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

>是否有更好的方法?

java 判断 子集_java – 获取集合子集的策略相关推荐

  1. java 判断用户名_java判断用户名和密码的方法

    java判断用户名和密码的方法 发布时间:2020-04-28 11:18:51 来源:亿速云 阅读:122 作者:小新 今天小编给大家分享的是java判断用户名和密码的方法,相信很多人都不太了解,为 ...

  2. java判断或_Java判断用户名和密码是否符合要求过程详解

    这篇文章主要介绍了Java判断用户名和密码过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 假设在某仓库管理系统的登录界面中需要输入用户名和密 ...

  3. java判断文件格式_java判断检验各种文件类型,如gz、txt等

    java判断检验各种文件类型,通过读取文件头(前4位),可判断gz等格式,代码如下: import java.io.FileInputStream; import java.io.IOExceptio ...

  4. java判断 图片_java判断是否为图片的步骤和方法

    小编今天看到有个小伙伴问java如何判断上传的东西是否是图片,刚好小编有时间就给小伙伴解决一下如何判断的方法. 1.打开Eclipse,在项目工程一栏,也就是左边这一栏的空白处右击鼠标, 选择new- ...

  5. java判断质数_Java判断素数

    Java判断素数 public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.p ...

  6. java 判断当天_java判断一个时间是否是今天的方法

    java判断时间是否是今天:public class Test { /** * java 判断一个时间是不是今天的时间范围内 * @param args */ public static void m ...

  7. java set子集_Java 求集合的所有子集

    packagech01;importjava.util.HashSet;importjava.util.Iterator;importjava.util.LinkedList;importjava.u ...

  8. java 通用类型_Java获取通用类型的集合

    你的方法很好它应该适用于List< String>和Collection< String&gt ;.例如,见这个示例代码: public class Demo { List ...

  9. java 有序容器_Java 容器集合框架概览

    Java Collections Framework 集合的概念 集合collection,有时叫做容器container,把多个元素组成一个单元. 早期的Java (pre-1.2) 中包含了Vec ...

最新文章

  1. 基于Spark ML 聚类分析实战的KMeans
  2. text-shadow
  3. 《数学建模:基于R》——2.2 方差分析
  4. Matlab去掉数组中0
  5. POJ 1013 Counterfeit Dollar 称硬币
  6. java 多线程性能_Java中多线程的性能比较
  7. 动态获取某个元素的高度_codeforces 1443D,解法简单,思维缜密的动态规划问题...
  8. 记录几个CentOS安装包(rpm)的下载地址-离线安装必备
  9. pytorch 训练face出现的问题
  10. 阿里五年晋升三次,选择真的大于努力?
  11. 【深入JVM内核—原理、诊断与优化】第2期开课了
  12. 机械工程专业英语复习
  13. windows2008 FTP下载“当前的安全设置不允许”的解决方法
  14. 行政组织理论-阶段测评4
  15. Windows之API集合
  16. 哪一个属于计算机外存储器,下边哪一个属于计算机的外存储器()
  17. [Setting]设置Word插入题注快捷键
  18. 集算器读写 json
  19. 数据库连接和数据库连接池连接
  20. 小学生图片_2020中秋节对家人的祝福语 送手抄报小学生图片大全简单又漂亮

热门文章

  1. 跟我一起玩Win32开发(1):关于C++的几个要点
  2. C# 文件直接打印功能
  3. NYOJ 87-棋盘分割(记忆化搜索)
  4. virtual的用法
  5. 获取Device Name方法
  6. 自学Python day03-if语句
  7. 堆叠降噪自动编码器 Stacked Denoising Auto Encoder(SDAE)
  8. 小程序离屏canvas(createOffscreenCanvas)生成推广海报
  9. 51nod 2455 花园
  10. chroot 与 jail