java - 将过滤后的第二个表的两列映射到一个 Collection 成员
问题描述
概括
我想知道是否可以将以下查询映射到实体类的成员Bar
:
Select f.columnA, f.columnB From Foo f Where f.barId = '[someDynamicBarId]';
注意:我无法更改架构(例如添加映射表)。
背景
我有课程Bar
,Foo
并且我想从一个非常大的表(10m个条目)中添加一个Map<String, BigDecimal>
或List<Object[]>
到仅包含条目的条目。Bar
Foo
Bar.barId = '[barId]'
我在延迟加载中显示50 个 元素,但我当前的获取和获取解决方案甚至对于这50个条目非常慢(80秒):Bar
dataTable
columnA
columnB
Foo
@OneToMany(fetch = FetchType.EAGER, mappedBy = "barId")
private List<Foo> fooList; // fooList.size() == 500
这应该替换为
private Map<String, BigDecimal> fooMap;
或者
private List<Object[]> fooList; // object { columnA, columnB }
我尝试@ElementCollection
与@OneToMany
Hibernate@Where
或@WhereJoinTable
. 问题是我无法在这些查询中定义变量。@Formula
也不起作用,因为它旨在仅返回一行。
结构
这些课程是:
class Bar {
@Id
private String barId;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "barId")
private List<Foo> fooList;
...
}
class Foo {
@Id
private String fooId;
private String columnA; // not unique
private BigDecimal columnB; // not unique
private String barId; // not unique
...
}
columnA
每个人都是独一无二的barId
:
barId columnA
---------------
b01 cA01
b01 cA02
b01 cB01
b02 cA01
b02 cA02
b02 cB01
结果
我想要Bar
这样:
class Bar {
@Id
private String barId;
@ElementCollection
@MapKeyColumn(name = "columnA") // ?
@Column(name = "columnB") // ?
// ? @Filter('barId = :barId')
// ? @Formula('Select f.columnA, f.columnB From Foo f Where f.barId = barId')
// ? @Where('barId = :barId')
private Map<String, BigDecimal> fooMap;
...
}
实际上,如果我能在合理的时间内得到 ( barId
,)columnA
的组合,我的问题就会得到解决。columnB
不必像我上面描述的那样实现。这些表在数据库中请求的列上建立索引。
解决方案
Gna,我刚刚找到了解决方案。
class Bar {
@Id
private String barId;
@ElementCollection(targetClass = BigDecimal.class, fetch = FetchType.EAGER )
@JoinTable(name="Foo", joinColumns = @JoinColumn(name = "barId"))
@MapKeyColumn(name = "columnA")
@Column(name = "columnB")
private Map<String, BigDecimal> fooMap;
...
}
主要问题仍然存在:它非常慢(57秒)。有什么提高速度的建议吗?
编辑:在数据库中重新创建索引解决了这个问题。现在只需不到一秒钟的时间即可获得完整的桌子。
推荐阅读
- javascript - 如何在 jQuery .each() 函数中使用“类”而不是“ID”?
- reactjs - 找不到 doc 和 docx 的 GooglePicker mimeTypes
- c++ - 如何以编程方式从头开始创建弯头连接器?
- spring-boot - 春季启动的aws-java sdk依赖问题
- javascript - 参数“href”应代表 facebook 中的有效 URL
- react-native - React Native Webview 在点击时推送新页面
- css - 为什么我无法更改工具提示背景颜色?
- azure - SSRS 报告 Azure 上的部署
- azure - 使用 microsoft/azure-functions-deploy:1.0.1 从 Bitbucket 管道到 Azure 的 Python 函数部署中的 Scm Uri 错误
- c - 当我将 0 作为 getline 的第二个参数传递时会发生什么?