我想知道是否可以将以下查询映射到实体类Bar
的成员:
Select f.columnA, f.columnB From Foo f Where f.barId = '[someDynamicBarId]';
注意:我无法更改架构(例如,添加映射表)。
我有Bar
和Foo
类,我想从一个很大的表{{1}中向Map<String, BigDecimal>
添加一个List<Object[]>
或Bar
}( 10m 个条目),仅包含Foo
的条目。
我在延迟加载的Bar.barId = '[barId]'
中显示了 50 Bar
个元素,但是我目前的解决方案是从{{1}中获取dataTable
和columnA
}甚至对于这些 50 条目来说都很慢( 80 秒):
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 }
与Hibernate的@ElementCollection
或@OneToMany
结合使用。问题是我无法在这些查询中定义变量。 @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
的组合,我的问题就可以解决。不必像我上面描述的那样实现。这些表在数据库中的请求列上建立索引。
答案 0 :(得分:0)
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 秒)。有提高速度的建议吗?
编辑:在数据库中重新创建索引可以解决该问题。现在只需不到一秒钟即可获得完整表格。