Java 是否可以使用HibernateAPI复制复杂的查询结果?

Java 是否可以使用HibernateAPI复制复杂的查询结果?,java,oracle,hibernate,hql,criteria,Java,Oracle,Hibernate,Hql,Criteria,我有下表,我有 另一张桌子上有 我需要找到一个特定季节的所有第一个事件谁没有一个参考字符。我想出了SQL代码来实现这一点,但我想使用Hibernate为我映射GameOfThronesEvent对象,而SQLQuery.list不会这样做 所以,我要么冷静下来,想办法让hibernate为我映射这些,这可能吗???,要么跛脚,使用手动结果转换器 如果您想亲自尝试,以下是我的sql: create table GOT_EVENTS(event_id number(3) primary key,

我有下表,我有

另一张桌子上有

我需要找到一个特定季节的所有第一个事件谁没有一个参考字符。我想出了SQL代码来实现这一点,但我想使用Hibernate为我映射GameOfThronesEvent对象,而SQLQuery.list不会这样做

所以,我要么冷静下来,想办法让hibernate为我映射这些,这可能吗???,要么跛脚,使用手动结果转换器

如果您想亲自尝试,以下是我的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)
这是我需要在Criteria或HQL中用hibernate表示的部分,这样它就可以将got_事件中的内容映射到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 transformer结合使用

您需要创建一个bean,该bean具有基于查询中返回的命名列的相关字段


如果您需要它来映射非标准数据类型,那么事情可能会变得有点棘手。日期和枚举可能会导致问题。我在过去看到的两种解决方案是声明标量,或者,如果这证明太困难,您可以尝试使用一个setter,它接受字符串参数并自行执行转换。

这与问题无关。。。但是你在创造什么呢?作为一个粉丝,我对你很感兴趣,hahaI认为表值只是与实际应用程序无关的样本数据。如果你用你的查询创建一个数据库视图,并把它映射到一个简单的hibernate表上。我只是尽我所能简化了这个例子,并试图让它变得有趣。基本上,我所做的是在每次新事件发生时发送通知。但我不想为每一个事件发送通知,只发送新季度的第一个事件。我确实查看了AliasToBean ResultTransformer,但我的bean中有joda DateTime对象。所以我必须从java.sql.Date转到org.joda.time.DateTime对象。Hibernate可能足够聪明,可以理解这一点,因为它是从瞬间创建的,但不幸的是,我没有测试它。我以为它不会工作,我自己做了变压器。也许你应该试一下。
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)
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;