- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 Hibernate 从表中检索大约 1 亿行。我有一个持久实体项目,其中包含内部的费用集合(另一个持久实体)。鉴于我将遍历结果并访问每个对象的费用,我想急切地获取费用以避免 n+1 问题。
我还应该提到我想将它连接到另一个名为 Provider 的表(一对一映射但没有外键)。我试过:
String query = "select new " + Order.class.getName()
+ "(i, p) from Item i left join fetch i.fees f, Provider p where "
+ "p.factoryId=i.factoryId and p.factoryRef=i.factoryRef";
return session.createQuery(query).scroll();
我的 Order 类包含一个 Provider 字段和一个 Item 字段。我收到此错误:
Caused by: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
我想以一个可滚动的订单列表结束,其中包含项目(急切收取的费用)和提供商。
最佳答案
SelectClause
中的这段代码会给您带来麻烦:
if ( !fromElementsForLoad.contains( origin ) ) {
throw new QueryException(
"query specified join fetching, but the owner " +
"of the fetched association was not present in the select list " +
"[" + fromElement.getDisplayText() + "]"
);
如您所见,当提到 fetch 关键字时,hibernate 会检查您是否请求 fetch 装饰字段 parent。 fromElementsForLoad.contains(原点)
他们这样做可能是为了防止您进行冗余连接,这会降低您的性能。这是一件好事,因为如果您从不使用它,就没有理由获取它。
我相信在你的情况下 - 在新的 Order.class
中包装 Item.class
隐藏了你在查询中使用 fetch 装饰字段 parent 的事实.
我目前没有调试能力,所以我无法验证这一点。尝试调试 SelectClause.class 中的这一行并查看 fromElementsForLoad
集合包含哪些元素。
如果您想避免 n+1 问题,我建议在查询后初始化 Order.class。您只能选择项目和提供者。
如果您无法验证这一点,我将在下周找到合适的计算机并扩展我的答案。
关于java - 渴望使用 ScrollableResults 在 Hibernate 中获取集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10217590/
我必须将可滚动结果引用转换为列表引用。是否可以?当我尝试转换时,我收到异常 java.lang.ClassCastException: org.hibernate.impl.ScrollableRes
我在 MySQL 数据库的表用户中有 7500 行,VM 选项:-Xmx8m 和下面的一些代码: Query query = session.createQuery("select u from Us
我们运行的一些查询有 100'000 多个结果,加载它们然后将它们发送给客户端需要很长时间。所以我使用 ScrollableResults 来获得分页结果功能。但我们在大约 50,000 个结果时达到
我正在尝试提取与某些谓词匹配的 count(*) 。每次我使用 createSQLQuery 时,我发现自己必须按照以下方式编写代码: // skipped code Query q = sessio
这是我第一次尝试这个,但我收到以下错误: The result set is closed 尝试使用ScrollableResults时。 @Override public void associar
我执行一个返回实体列表的查询。如何从 ScrollableResults 中检索实体: Session s = ....; Query q = s.createQuery("....") # r
我正在尝试使用 Hibernate 从表中检索大约 1 亿行。我有一个持久实体项目,其中包含内部的费用集合(另一个持久实体)。鉴于我将遍历结果并访问每个对象的费用,我想急切地获取费用以避免 n+1 问
我使用 ORM 框架已有一段时间了,但我对 Hibernate 还是比较陌生。 假设您有一个查询(它是一个查询还是一个条件,无关紧要)检索了一个很好的结果集并且您想要对其进行分页。您更愿意使用 set
使用 JPA/Hibernate 的简单 Java 批量读取数百万行。我的问题是:如何使用 ScrollMode.FORWARD_ONLY 识别 ScrollableResults 中的最后结果? 使
我只需要使用 Hibernate 读取 MySQL 数据库中表中的每一行并基于它编写一个文件。但是有 9000 万行,而且非常大。因此,以下内容似乎是合适的: ScrollableResults re
重要提示:这已被接受为 Spring issue目标修复版本为 4.1.2。 我的目标是在从 Hibernate 的 ScrollableResults 生成 HTTP 响应时实现 O(1) 空间复杂
我是一名优秀的程序员,十分优秀!