0

我想将实体映射到另一个实体(1:1)并使用 Hibernate 在 sql 表达式中指定条件。

我有带有表位置和主题的 ERA 计划。对象与职位有 1:N 的关系。每个职位都有创建日期。我想通过休眠将最后创建的位置(来自 N 的具有相同 subject_id 的位置)作为实体映射到实体主题中。

我尝试了@Formula,但没有成功。

@Entity
public class Position {
  ..
}

@Entity
public class Subject {
  ..

  @Basic(fetch = FetchType.LAZY)        
  @Formula("select p.* from position p inner join (select subject_id, max(position_date) maxdate from position where subject_id = 3743073 group by subject_id ) pmaxgrouped on p.subject_id = pmaxgrouped.subject_id and p.position_date = pmaxgrouped.maxdate")
  private Position lastPosition;
}

Hibernate 不匹配结果 sql 查询。

SELECT *
FROM
  (SELECT giposobj0_.POSOBJ_ID    AS POSOBJ1_1688_,
    giposobj0_.SYS_AGENDA_ID      AS SYS2_1688_,
    giposobj0_.SYS_INS_DATE       AS SYS3_1688_,
    giposobj0_.SYS_LOGIN_ID_INS   AS SYS4_1688_,
    giposobj0_.SYS_LOGIN_ID_UPD   AS SYS5_1688_,
    giposobj0_.SYS_UPD_DATE       AS SYS6_1688_,
    giposobj0_.SYS_LOGIN_ID_OWNER AS SYS7_1688_,
    giposobj0_.SYS_ORGUNIT_ID     AS SYS8_1688_,
    giposobj0_.SYS_PUBKIND_LEVEL  AS SYS9_1688_,
    giposobj0_.POSOBJ_CODE        AS POSOBJ10_1688_,
    giposobj0_.POSOBJ_IMEI        AS POSOBJ11_1688_,
    giposobj0_.POSOBJ_LASTSTATUS  AS POSOBJ12_1688_,
    giposobj0_.POSOBJ_MODEL       AS POSOBJ13_1688_,
    giposobj0_.POSOBJ_NOTIF       AS POSOBJ14_1688_,
  SELECT p.*
  FROM position p
  INNER JOIN
    (SELECT giposobj0_.posobj_id,
      MAX(giposobj0_.position_date) giposobj0_.maxdate
    FROM position
    WHERE giposobj0_.posobj_id = 3743073
    GROUP BY giposobj0_.posobj_id
    ) giposobj0_.pmaxgrouped
  ON p.posobj_id      = pmaxgrouped.posobj_id
  AND p.position_date = pmaxgrouped.maxdate AS formula11_
  FROM eira_gi.VS_POSOBJ giposobj0_
  WHERE giposobj0_.POSOBJ_IMEI=111111111111111
  );
4

1 回答 1

0

选项1:您使用@OrderBy创建一个有序列表。随后,您可以返回该集合中的最后一个对象。这是一个非常好的教程

选项2:每次保存或更新主题时保存相关的“lastPosition”。

于 2013-08-13T23:05:32.900 回答