java - 是否可以使用 Hibernate API 复制复杂的查询结果?

标签 java oracle hibernate hql criteria

我有下表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/

相关文章:

java - 如何将Excel的特定列插入数据库

java - Java中变量或方法的最大名称长度

java - Google Play 服务(RESULT_LICENSE_FAILED)

java - 如何切片二维 Java 数组?

sql - DD-MMM-YYYY 格式的日期,例如 29-JAN-2015

java - 插入海量数据时的 Hibernate 性能问题

java - 使用 Hibernate 注释的惰性一对一可选双向映射

java - 试图停止执行2秒钟

java - SQL - PreparedStatement - 效率 - JDBC

java - 错误 : A JNI error has occurred, 请检查您的安装并重试