Java 通过Hibernate使用sql查询映射实体

Java 通过Hibernate使用sql查询映射实体,java,hibernate,join,Java,Hibernate,Join,我想将实体映射到另一个实体(1:1),并使用Hibernate在sql表达式中指定条件 我有带桌子位置和主题的ERA方案。受试者与位置的关系为1:N。 每个职位都有创建日期。我想通过hibernate将上一次创建的位置(一个来自N且主题id相同的位置)映射为实体主题 我尝试了@Formula,但没有成功 @Entity public class Position { .. } @Entity public class Subject { .. @Basic(fetch = Fet

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

我有带桌子位置和主题的ERA方案。受试者与位置的关系为1:N。 每个职位都有创建日期。我想通过hibernate将上一次创建的位置(一个来自N且主题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
  );

选项1:使用创建有序列表。随后,可以返回该集合中的最后一个对象。这是一个很好的例子


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

你不应该这样做。如果没有任何位置,并且subselect返回0结果,该怎么办?如果您在修改头寸后使用现金,“lastPosition”将不会更新。如果没有任何头寸,hibernate可能会为字段“lastPosition”返回null。