Этот материал:
least(abs(gene_start - ?) , abs(gene_end - ?))
вообще не индексируется.Я полагаю, у вас есть индексы на gene_start и gene_end, так что вы можете сделать:
SELECT id, gene_start
FROM arraydata.gene WHERE chromosomeref = ?
WHERE gene_start > ?
ORDER BY gene_start LIMIT 1
SELECT id, gene_end
FROM arraydata.gene WHERE chromosomeref = ?
WHERE gene_end < ?
ORDER BY gene_end DESC LIMIT 1
Вы можете комбинировать оба с UNION.Что касается выражения в Hibernate, не знаю!