hibernate选择最近执行的子实体

v9tzhpje  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(302)

我想把最近一次处决 ChildEntityParentEntity 基于上一个 lastExecutionTimestamp 现场。我尝试了以下不起作用的查询。
类关系:parententity<1-onetomany-x>childentity<1-onetomany-x>孙子实体
这个 ChildEntity 有一个领域 lastExecutionTimestamp ,我想将其用于最近执行的childentity。假设该方法返回 List<ChildEntity> 只有一张唱片。childentity应该包含所有关联的 grandChildEntities 在里面。
有什么意见吗?

@Query(value = "select pr.childEntities from ParentEntity pr " +
   "inner join pr.childEntities ch ON pr.id = ch.parentEntity " +
   "inner join ch.grandChildEntities gc ON ch.id = gc.childEntity " +
   "where pr.bumId = ?1 and ch.lastExecutionTimestamp = ( select max(lastExecutionTimestamp) from ChildEntity)"
)
List<ChildEntity> findLastExecutedChildFromBumId(@Param("bumId") String bumId);

关联类实体

@Entity
@Getter
@Setter
@Table(name = "table_parent")
@RequiredArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
public class ParentEntity implements Serializable {

   private static final long serialVersionUID = -271246L;

   @Id
   @SequenceGenerator(
      name="p_id",
      sequenceName = "p_sequence",
      initialValue = 1,
      allocationSize = 1)
   @GeneratedValue(generator="p_id")
   @Column(name="id", updatable=false, nullable=false)
   private Long id;

   @NonNull
   @Column(name ="bum_id", nullable = false, unique = true)
   private String bumId;

   @NonNull
   @Column(nullable = false, length = 31)
   private String f1;

   @NonNull
   @Column(nullable = false, length = 31)
   private String f2;

   @NonNull
   @Column( nullable = false, length = 255)
   @Convert(converter = JpaConverterJson.class)
   private List<String> f3;

   @NonNull
   @Column(nullable = false)
   private String f4;

   @NonNull
   @Column(name = "es_status", nullable = false, length = 255)
   @Enumerated(EnumType.STRING)
   private ExecutionStatus esStatus;

   @JsonManagedReference
   @OneToMany(mappedBy = "parentEntity", cascade = CascadeType.ALL,
       fetch = FetchType.EAGER)
   @Setter(AccessLevel.NONE)
   private List<ChildEntity> childEntities;

   public void setChildEntities(List<ChildEntity> childEntities) {
      this.childEntities = childEntities;
      childEntities.forEach(entity -> entity.setParentEntity(this));
   }
}

@Entity
@Getter
@Setter
@Table(name= "table_child")
@NoArgsConstructor
public class ChildEntity implements Serializable {
   private static final long serialVersionUID =  -925587271547L;

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @JsonBackReference
   @ManyToOne(fetch = FetchType.EAGER )
   @JoinColumn(name = "parent_id")
   private ParentEntity parentEntity;

   @Column(name = "c1",nullable = false)
   @NonNull
   @Convert(converter = JpaConverterJson.class)
   private String c1;

   @Column(name = "last_exec_status",nullable = false)
   @NonNull
   @Enumerated(EnumType.STRING)
   private ExecutionStatus lastExecStatus;

   @Column(name = "c4",nullable = false)
   @NonNull
   private String  c4;

   @Column(name = "last_execution_timestamp",nullable = false)
   @NonNull
   private long lastExecutionTimestamp;

   @JsonManagedReference
   @NonNull
   @OneToMany(mappedBy = "childEntity", cascade = CascadeType.ALL,
      fetch = FetchType.EAGER)
   @Setter(AccessLevel.NONE)
   private List<GrandChildEntity> grandChildEntities;

   public void setGrandChildEntities(List<GrandChildEntity> grandChildEntities) {
      this.grandChildEntities = grandChildEntities;
      grandChildEntities.forEach(entity -> entity.setChildEntity(this));
   }
}

@Entity
@Getter
@Setter
@Table(name="table_grand_child")
@NoArgsConstructor
//@AllArgsConstructor
public class GrandChildEntity implements Serializable {
   private static final long serialVersionUID = -925567241248L;

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @JsonBackReference
   @ManyToOne(fetch = FetchType.EAGER )
   @JoinColumn(name = "child_entity_id")
   private ChildEntity childEntity;

   @Column(name="gc1",nullable = false)
   private String gc1;

   @Column(name="gc2",nullable = false)
   private String gc2;

   @Column(name="gc3",nullable = false)
   private String gc3;

   @Column(name="gc3",nullable = true)
   private List<String> gc3;
}
lx0bsm1f

lx0bsm1f1#

尝试使用以下查询:

@Query("select ch from ChildEntity ch "
  + " join ch.parentEntity pr "
  + " join fetch ch.grandChildEntities gc "
  + " where pr.bumId = :bumId and ch.lastExecutionTimestamp = ( select max(ch1.lastExecutionTimestamp) from ChildEntity ch1 where ch1.parentEntity = pr)")
List<ChildEntity> findLastExecutedChildFromBumId(@Param("bumId") String bumId);

相关问题