将已过滤的第二张表的两列映射到一个Collection成员

时间:2019-04-17 15:36:10

标签: java hibernate jpa

摘要

我想知道是否可以将以下查询映射到实体类Bar的成员:

Select f.columnA, f.columnB From Foo f Where f.barId = '[someDynamicBarId]';

注意:我无法更改架构(例如,添加映射表)。

背景

我有BarFoo类,我想从一个很大的表{{1}中向Map<String, BigDecimal>添加一个List<Object[]>Bar }( 10m 个条目),仅包含Foo的条目。

我在延迟加载的Bar.barId = '[barId]'中显示了 50 Bar个元素,但是我目前的解决方案是从{{1}中获取dataTablecolumnA }甚至对于这些 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

实际上,如果我可以在合理的时间内得到(Barclass 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的组合,我的问题就可以解决。不必像我上面描述的那样实现。这些表在数据库中的请求列上建立索引。

1 个答案:

答案 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 秒)。有提高速度的建议吗?

编辑:在数据库中重新创建索引可以解决该问题。现在只需不到一秒钟即可获得完整表格。

相关问题