我希望在另一个字段(时间戳)的最大值内找到一个字段的最大值(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;
...
HQL生成的SQL是:
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)
答案 0 :(得分:0)
您可以避免在同一张表上重复加入
select max(cast(trade_id as signed)) as col_0_0_
from trade
INNER JOIN (
select max(timestamp) max_value
from tradewhere currency_pair_id=21185903
) t on t.max_value = trade.timestamp