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