0

Hibernate を使用してエンティティを別のエンティティ (1:1) にマップし、SQL 式で条件を指定したいと考えています。

テーブルの位置と件名を使用したERAスキームがあります。サブジェクトは位置に対して 1:N の関係があります。各ポジションには作成日があります。最後に作成された位置(同じ subject_id を持つ N からの 1 つ) をエンティティとしてHibernate を介してエンティティ サブジェクトにマップしたいと思います。

@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