Сопоставить два столбца отфильтрованной второй таблицы одному члену коллекции - PullRequest
0 голосов
/ 17 апреля 2019

Сводка

Интересно, можно ли сопоставить следующий запрос члену класса сущности Bar:

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

Примечание: Я могуизменить схему (например, добавить таблицу сопоставления).

Фон

У меня есть классы Bar и Foo, и я хочу добавить Map<String, BigDecimal> или List<Object[]> до Bar из очень большой таблицы Foo ( 10m записей) для записей, содержащих только Bar.barId = '[barId]'.

Я отображаю 50 Bar элементовв лениво загруженном dataTable, но мое текущее решение получить columnA и columnB из Foo даже для этих 50 записей очень медленное ( 80 секунд):

@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 в связи с @Where Hibernate или@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 в разумный срок.Не должно быть реализовано, как я описал выше.Таблицы индексируются по запрошенным столбцам в базе данных.

1 Ответ

0 голосов
/ 17 апреля 2019

Гна, я только что нашел решение.

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 секунд). Есть предложения по улучшению скорости?

Редактировать: Восстановление индексов в базе данных решило проблему. Теперь полный стол занимает меньше секунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...