Выберите следующую позицию - PullRequest
0 голосов
/ 05 мая 2011

Можно ли выразить этот запрос (из Postgres) как в HQL или как запрос критерия гибернации?

SELECT id, least(abs(gene_start - ?) , abs(gene_end - ?)) as div_pos
FROM arraydata.gene WHERE chromosomeref = ?
ORDER BY div_s LIMIT 1

Или есть другой способ выбрать запись рядом с данной позицией,Где начало или конец одной записи из таблицы имеет наименьшее расстояние до запроса.

1 Ответ

1 голос
/ 05 мая 2011

Этот материал:

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, не знаю!

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