我有下表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() 不会执行此操作。
所以,我要么需要冷静并弄清楚如何让 hibernate 为我映射这些(这可能吗???),要么蹩脚并使用手动 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)
这是我需要用 Hibernate 表示的部分,无论是在 Criteria 中还是在 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 转换器结合使用?
您需要创建一个 Bean,其中包含基于您将在查询中返回的命名列的相关字段。
如果您需要它来映射非标准数据类型(日期和枚举可能会导致问题),事情可能会变得有点棘手。我过去见过的两种解决方案是声明标量,或者,如果这证明太困难,您可以尝试使用接受 String 参数并自行执行转换的 setter。
关于java - 是否可以使用 Hibernate API 复制复杂的查询结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992066/