Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Hibernate] Данные из запроса без класса, как получить? 
V
    Опции темы
Ares4322
Дата 7.4.2010, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 2
Всего: 3



Доброго времени суток!
Использую Hibernate. Формирую запрос вручную. Как мне получить данные из ответа на запрос без привязки к какому-то определенному классу?
PM MAIL   Вверх
MaxPayneC
Дата 7.4.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Код

Query q = session.createSQLQuery("some query");

Вот только возникает вопрос, зачем нужен хибернейт, если вы все равно пользуетесь запросами?
PM   Вверх
Ares4322
Дата 7.4.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 2
Всего: 3



1. Для единого файла настройки параметров соединения с БД. У меня часть программы  - Struts2, которая работает с БД через DAO и Hibernate. Тут все понятно - отображение ТБД на объект. А вторая часть - Ajax. так вот загрузчик данных для AJAX работал на простом JDBC. И получалось, что 2 точки одинаковых настроек.
2. Для ускорения работы с БД, так как в hibernate есть готовый пул коннектов.
3. Для логирования работы с БД. Так как hibernate есть встроенный логгер.
Я думаю, что тут можно еще пунктов добавить. Но в общем и целом - вот для этого.

Сейчас я не использую отображение ТБД на класс, но в принципе можно его сделать , чтобы потом класс целиком сериализовывать в JSON, а не формировать Map вручную из полей ответа на запрос.

Так есть все-таки ответ на мой вопрос?
PM MAIL   Вверх
MaxPayneC
Дата 7.4.2010, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Да, я привел код постом выше smile
Возможно я грубовато выразился, если да - извиняюсь. Просто написание sql руками при использовании хибернейт крайне не рекомендуется.
PM   Вверх
afon
Дата 7.4.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.4.2008
Где: Украина, Киев

Репутация: нет
Всего: 1



Простые данные, вытащенные любым native query можно на лету мапить на любой не entity класс (если конечно он тоже простой, без связей/иерархий).
Ну, допустим, быстро делаем такую заглушку

class UserRanks {
  private int id; 
  private String name;
  private int rank;
}

@SuppressWarnings
List<UserRanks> ranks = getHibTempl().findByNativeQuery(..... "select id, name, rank from tbl_Relations where group_id=12" .....);

PM MAIL WWW   Вверх
Ares4322
Дата 7.4.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 2
Всего: 3



А вообще без заглушки можно? То есть я List (который по сути является набором записей из БД )в качестве ответа получил и как мне из него вытащить данные без класса?
PM MAIL   Вверх
5ad1sT
Дата 7.4.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 10.2.2009

Репутация: нет
Всего: нет



Цитата(Ares4322 @ 7.4.2010,  12:34)
А вообще без заглушки можно? То есть я List (который по сути является набором записей из БД )в качестве ответа получил и как мне из него вытащить данные без класса?

А как Вы собираетесь оттуда данные получать? smile
PM MAIL   Вверх
Ares4322
Дата 7.4.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 2
Всего: 3



Ну я вот и спрашиваю можно ли так сделать или нет.
Или Вы хотите, чтобы теперь я отвечал?
PM MAIL   Вверх
MisterCleric
Дата 7.4.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Такой пример годиться?
Код

<sql-query name="сount">
        <return-scalar column="count" type="java.lang.Integer"/>
        select FN_CNT(:Id1, :Id2, :fromDate, :toDate) count  from dual
    </sql-query>




--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Ares4322
Дата 7.4.2010, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 2
Всего: 3



А без xml это можно сделать, прямо в коде?
PM MAIL   Вверх
MisterCleric
Дата 7.4.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Ану смотри здесь:
Native query


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Ares4322
Дата 7.4.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 2
Всего: 3



вот сделал я так
Код

sess.createSQLQuery("SELECT * FROM CATS")
 .addScalar("ID", Hibernate.LONG)
 .addScalar("NAME")
 .addScalar("BIRTHDATE")

А как мне потом данные полей запроса получить отсюда?
PM MAIL   Вверх
MisterCleric
Дата 7.4.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

А как мне потом данные полей запроса получить отсюда? 

А текст ты вообще читал по той ссылке, что я предоставил? По-моему там четко написано:

Цитата

These will return a List of Object arrays (Object[]) with scalar values for each column in the CATS table. 


а потом:

Цитата

This will return Object arrays, but now it will not use ResultSetMetadata but will instead explicitly get the ID, NAME and BIRTHDATE column as respectively a Long, String and a Short from the underlying resultset. This also means that only these three columns will be returned, even though the query is using * and could return more than the three listed columns.


Что не понятно?


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
afon
Дата 7.4.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.4.2008
Где: Украина, Киев

Репутация: нет
Всего: 1



MisterCleric сейчас достанет пистолет и всех постреляет smile Что не понятно!? smile


class SimpleCat {
 long id, String name, Date birthdate;
}

List<SimpleCat> cats = sess.createSQLQuery("SELECT * FROM CATS") .addScalar("ID", Hibernate.LONG) .addScalar("NAME") .addScalar("BIRTHDATE").asList()



Это сообщение отредактировал(а) afon - 7.4.2010, 18:43
PM MAIL WWW   Вверх
MisterCleric
Дата 7.4.2010, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Есть у меня такой пример с этими скалярами:
Код

<sql-query name="policyPaymentHistoryStatistic">
        <return-scalar column="FullPays" type="long"/>
        <return-scalar column="PlanPays" type="long"/>
        <return-scalar column="Debt" type="double"/>
        select sum(case when nvl(amount,0) &lt;= nvl(USEDAMOUNT,0) then 1 else 0 end) FullPays,
        sum(case when paydate &lt; sysdate then 1 else 0 end) PlanPays,
        sum(case when paydate &lt; sysdate and nvl(amount,0) &gt; nvl(USEDAMOUNT,0) then nvl(amount,0)-nvl(USEDAMOUNT,0)
        else 0 end) Debt
        FROM IPDOCAGGR
        WHERE INSURANCEPOLICYINITIALID =:policyInitialId
        AND documenttype &lt;&gt; 4
        AND NOT EXISTS (SELECT 1
        FROM expecteddocument ex
        WHERE ex.stornoid = expecteddocumentid)
    </sql-query>


Вызывается оно так:
Код

 public List getPolicyPaymentHistoryStatistic(Policy policy) {
        return manager.createNamedQuery("policyPaymentHistoryStatistic").setParameter("policyInitialId", policy.getInitialId()).getResultList();
    }

А разбирается так:
Код

    public String history() throws Exception {
        List statList = facade.getPolicyPaymentHistoryStatistic((Policy) session.get(SELECTED_POLICY_IN_SESSION));
        Object[] row = (Object[]) statList.get(0);
        historyPaymentCount = (Long) row[0];
        historyAllPayments = (Long) row[1];
        historyDebts = ((Double) row[2]) / 100;
        return "history";
    }


Авось да поможет...


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.