У меня есть следующая таблица 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;
Вы пытались использовать SQL-запрос в сочетании с трансформатором aliasToBean?
Вам нужно будет создать компонент, который имеет соответствующие поля на основе именованных столбцов, которые вы вернете в своем запросе.
Все может немного запутаться, если вам нужно сопоставить нестандартные типы данных (даты и перечисления могут вызвать проблемы). Два решения, которые я видел в прошлом, объявляют скаляры, или, если это слишком сложно, вы можете попробовать использовать сеттер, который принимает аргумент String и выполняет само преобразование.