HQL, чтобы вернуть индекс объекта в упорядоченном результате запроса? - PullRequest
0 голосов
/ 09 февраля 2009

Могу ли я использовать 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 );

Недостаток в том, что мы загружаем каждый dog.id в память.

Сценарий, где мне нужно это:

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

Ответы [ 5 ]

1 голос
/ 13 февраля 2009

используйте List.indexOf (). Если список слишком велик, сделайте список «очень ленивым».

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


Исправленный ответ:

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

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


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

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

0 голосов
/ 13 февраля 2009

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

Полагаю, вы пытаетесь реализовать нумерацию страниц.

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 голосов
/ 11 февраля 2009

Загрузка всего списка результатов в память, а затем использование логики приложения только для фильтрации того, что вам нужно, - это НЕПРАВИЛЬНЫЙ способ взаимодействия с базой данных.

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

0 голосов
/ 11 февраля 2009

начиная с этого 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-запрос, я планирую:

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

Это сумасшедшее решение?

-

примечания

SQL для возврата rownum определенной строки? (с использованием Oracle db)

0 голосов
/ 09 февраля 2009

В списке Java вы можете сделать вызов indexOf (Object).

См. http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html для API.

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