2009-02-09 5 views
0

Могу ли я использовать HQL для получения индекса заказанного результата запроса?HQL возвращает индекс объекта в результате упорядоченного запроса?

Единственный способ, которым я знаю, это вернуть все результаты из базы данных, а затем перебрать все результаты.

Например, если:

<hibernate-mapping> 
<class name="Dog" table="DOG"> 

    <id name="id" type="int" column="DOG_id"> 
     <meta attribute="scope-set">protected</meta> 
     <generator class="native"/> 
    </id> 

    <property name="age" type="int" /> 

    <property name="name" type="string" /> 
</class>  
</hibernate-mapping> 

тогда эти типы запросов:

//determine where dog with id 43 is in the current search results for dogs ordered by age 
Query dogQuery = sess.createQuery("select d.id from Dog as d order by d.age"); 
List<Dog> dogList = dogQuery.list(); 
int idx = dogList.indexOf(43); 

или, более утонченный поиск по списку собак:

Query dogQuery = sess.createQuery("select d.id from Dog as d where (d.name='fluffy' OR d.age >= 3) order by d.age"); 
List<Dog> dogList = dogQuery.list(); 
int idx = dogList.indexOf(43); 

Недостатком здесь что мы загружаем каждую собаку в память.

Сценарий, где я должен был бы это:

  • отображения конкретного результата запроса (тысяч) в виде точки на линии. Линия и точка обновляются каждую минуту или около того. Эта визуализация дает обновления «реального времени» в ранге поискового запроса

ответ

1

использовать List.indexOf() Если список очень большой, то сделать список "экстра-ленивым".

Но зачем нужен индекс? Может быть, вы на самом деле нет (и, таким образом, вам не нужно будет решить эту проблему)


пересмотренную ответ:

Вы делаете это совершенно неправильно. Все, что вам нужно:

выберите кол (*) от собаки д, собака d1, где d.age < = d1.age и d1.id =: EntityId и d1.id <> d.id


Почему это работает: Этот запрос находит каждую собаку в том же возрасте или моложе, чем собака (d1), но является не d1. (но фактически не возвращают всех этих собак - так как нас это не волнует).

В графе указано количество собак «до» d1. Таким образом, вы можете указать, где d1 появляется в полном списке собак. Поскольку вам не нужно знать положение всех собак в списке, вам не нужно брать всех собак.

+0

Один сценарий, где мне это нужно: если мне нужно вернуться к правильной странице результатов для продукта, и каталог всегда меняется. – jedierikb

+0

Даже если список ненормальный, я все равно не буду знать, какой индекс является тем, который я ищу, если я не проверю каждый элемент (побеждая лишнюю лень). (если я понимаю, что не-ленивый правильно). – jedierikb

+0

«extra-lazy» означает, что при необходимости выбираются только элементы списка. http://www.hibernate.org/hib_docs/v3/reference/en-US/html_single/#performance-fetching-lazy , поэтому List.indexOf() должен работать, потому что поддержка PersistantList должна просто генерировать запрос, чтобы возвращать результат , – Pat

0

Загрузка всего списка результатов в память, а затем с использованием прикладной логики только для того, чтобы отфильтровать то, что вам нужно, чтобы взаимодействовать с базой данных. WRONG.

Используйте предложения SQL WHERE и HAVING, чтобы получить то, что вам нужно от БД в первую очередь.

0

начиная с этой HQL (действительна SQL тоже в этом случае):

select dog.id as dogId from canines dog order by dog.codename asc 

Оно может быть слегка модифицированная и вставляется в действительный запрос SQL (только для Oracle со столбцом RowNum):

select rn from 
(select dogid dogId, rownum rn from canines dog order by dogname asc) 
where dogid=206 

к сожалению, это не действует HQL ...

чтобы использовать мой первоначальный запрос HQL, чтобы получить ту же информацию, что и SQL запроса, я планирую:

  • имеет зимует генерировать мой HQL запрос в SQL она будет использовать, чтобы сделать список всех результатов (надеюсь, не выполнив запрос первым)
  • вставить эти гибернации сгенерированного SQL в новый запрос SQL с помощью sessionObj.createSQLQuery , Этот новый запрос будет выглядеть как рабочий sql выше.

Является ли это сумасшедшим решением?

-

ноты

SQL to return the rownum of a specific row? (using Oracle db)

0

Вы должны использовать что-то вроде объекта «Критерии гибернаций», чтобы вернуть только небольшой подраздел вашего запроса.

Я предполагаю, что вы пытаетесь реализовать разбивку на страницы.

Criteria criteria=session.createCriteria(Item.class); 
criteria.addOrder(Order.asc("name")); 
criteria.setFirstResult(100); 
criteria.setMaxResults(50); 
List pageResults=criteria.list(); 

Приведенный выше код был снят с: http://forum.springframework.org/archive/index.php/t-9658.html

Это также будет работать для каталога, который всегда обновляется, так как вы должны сделать этот запрос на каждом запросе страницы.

+0

Я хочу знать, на какой странице моих результатов есть элемент, который я ищу, чтобы правильно использовать setFirstResult. – jedierikb

+0

Если вам известен предмет, который вы ищете, просто покажите этот предмет. Затем покажите ссылку на каталог, из которого пришел элемент. Конечно, я не знаю всех ваших требований, но, пытаясь перейти на определенную страницу каталога, чтобы отобразить элемент, который вы знаете, идентификатор немного странный. – hooknc

+0

Спасибо, крючок. Вот еще один пример использования (без разбивки на страницы): отображение конкретного результата запроса (в тысячах) в виде точки на линии. Линия и точка обновляются каждую минуту или около того. Эта визуализация дает обновления «реального времени» в ранге поискового запроса. – jedierikb

 Смежные вопросы

  • Нет связанных вопросов^_^