Можно ли реплицировать результаты сложных запросов с помощью Hibernate API?

1

У меня есть следующая таблица GOT_CHARS

CHAR_ID     NAME             EVENT_ID
1           Hodor            3
2           Tyrion Lannister  1
3           Ned Stark        5

И еще одна таблица GOT_EVENTS

EVENT_ID    DESCRIPTION                 EVENT_DT                 SEASON_NBR
1           Drank wine                  1/5/2015 3:04:00 PM      1
2           Plundered                   2/5/2015 3:04:00 PM      2
3           Bought diapers              3/5/2015 3:04:00 PM      2
4           Swung sword                 4/6/2015 3:04:00 PM      1
5           Travelled to Kings Landing  6/7/2015 3:04:00 PM      3
6           Traded for supplies         8/9/2015 3:04:00 PM      1

Мне нужно найти все первые события определенного сезона, у которых нет ссылочного персонажа. Я придумал код SQL для этого, но я хотел бы использовать Hibernate для сопоставления объектов GameOfThronesEvent для меня, а SQLQuery.list() этого не сделает.

Итак, мне либо нужно быть крутым, и выяснить, как заставить спящий режим отображать их для меня (возможно ли это?), Или быть хромым и использовать руководство ResultTransformer.

Здесь мой sql, если вы хотите попробовать сами:

create table GOT_EVENTS(event_id number(3) primary key,
                        description varchar2(50) not null,
                        season_nbr number(2) not null,
                        event_dt date not null)

create table GOT_CHARS(char_id number(3) primary key,
                       name varchar2(50) not null,
                       event_id number(3) references GOT_EVENTS(event_id) not null)

Это бит, который мне нужно представить с помощью спящего режима, либо в критериях, либо в HQL, чтобы он отображал материал из got_events в объекты GameOfThronesEvent.

with ranked_events as
 (select e.*,
         ROW_NUMBER() over(partition by e.season_nbr order by e.event_dt) as rk
    from got_events e)
select c.*, re.*
  from ranked_events re
  left outer join got_chars c
    on re.event_id = c.event_id
 where c.event_id is null
   and re.rk = 1;
  • 0
    Это не имеет ничего общего с вопросом ... но что вы создаете? Как любитель GoT, у вас есть мой интерес, ха-ха
  • 0
    Я думаю, что значения таблицы - это просто пример данных, не связанных с реальным приложением.
Показать ещё 2 комментария
Теги:
hibernate
hql
criteria

1 ответ

0

Вы пытались использовать SQL-запрос в сочетании с трансформатором aliasToBean?

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

Все может немного запутаться, если вам нужно сопоставить нестандартные типы данных (даты и перечисления могут вызвать проблемы). Два решения, которые я видел в прошлом, объявляют скаляры, или, если это слишком сложно, вы можете попробовать использовать сеттер, который принимает аргумент String и выполняет само преобразование.

  • 0
    Я посмотрел на AliasToBean ResultTransformer, но в моем компоненте есть объекты DateTime joda. Поэтому я должен перейти от java.sql.Date к объектам org.joda.time.DateTime. Hibernate может быть достаточно умен, чтобы понять это, поскольку он создан мгновенно, но, к сожалению, я не проверял это. Я предположил, что это не сработает, и сделал свой собственный трансформатор. Возможно, следовало попробовать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню