Я хочу найти максимальное значение поля (tradeId, но приведено как Long) в пределах максимального значения другого поля (отметка времени).
У меня есть следующий HQL-запрос, который работает нормально и быстро, но мне интересно, если объединение таблицы с самим собой - это действительно самый элегантный способ достижения этого?EXPLAIN говорит мне, что «выбор таблиц оптимизирован», так что может и нет?
@Query("select max(cast(t1.tradeId as long)) from TradeDbo t1 inner join TradeDbo t2 on t1.id = t2.id"
+" where t2.timestamp = (select max(timestamp) from TradeDbo where currencyPair.id = :currencyPairId)")
Класс TradeDbo:
public class TradeDbo extends Auditable<String> {
@Id @GeneratedValue
@Getter private Long id;
@JoinColumn(name = "currency_pair_id")
@ManyToOne(fetch=FetchType.EAGER)
@Getter private CurrencyPairDbo currencyPair;
@Column(name = "timestamp")
@Convert(converter = DateConverter.class)
@Getter private Date timestamp;
@Column(name = "trade_id")
@Getter private String tradeId;
...
SQL, сгенерированный HQL:
select max(cast(tradedbo0_.trade_id as signed)) as col_0_0_ from trade tradedbo0_
inner join trade tradedbo1_ on (tradedbo0_.id=tradedbo1_.id)
where tradedbo1_.timestamp=(select max(tradedbo2_.timestamp)
from trade tradedbo2_ where tradedbo2_.currency_pair_id=21185903)