我相信下面的代码工作正常,但我的逻辑有缺陷,所以我正在寻求帮助以获得我真正想要的结果。此外,我认为我对JPA方法的尝试过于复杂,可能有更干净的解决方案。我知道我可能会使用@Query,但我想尝试让方法名解决方案也正常工作,这样我就可以了解我哪里出错了。
为了简单起见,我在本例中剥离了DB表,但是我有表1,它是顶级表,表2位于它下面,有一个外键返回到表1。
表1-
不幸的是,我相信通过下面的代码,它可以识别出表2的其中一条记录在所需的日期范围内,因此正在从表1中提取与ID相关的所有记录。但我可能在这一点上错了,逻辑也可能以不同的方式存在缺陷。
任何帮助都将不胜感激。
表1实体类
@Entity
@Table(name = "TABLE1")
public class Table1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, unique = true)
private Integer id;
@OneToMany(mappedBy = "table1", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<Table2> table2;
//Plus getters & setters
表2实体类
@Entity
@Table(name = "TABLE2")
public class Table2{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, unique = true)
private Integer id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "Table1Id")
@JsonBackReference
private Table1 table1;
@Column(name = "EffectiveDateTime", nullable = false)
private LocalDateTime effectiveDateTime;
//Plus getters & setters
回购类
@Repository
public interface Repository extends JpaRepository<Table1, Integer>, JpaSpecificationExecutor<Table1> {
public Optional<Table1> findTopByIdAndTable2EffectiveDateTimeLessThanEqualOrderByTable2EffectiveDateTimeDesc(int id, LocalDateTime now);
}
当前JSON返回
{
"id": 5
"Table2": [
{
"id": 6,
"effectiveDateTime": "2021-01-01T00:00:01"
},
{
"id": 8,
"effectiveDateTime": "2022-01-01T00:00:01"
},
{
"id": 9,
"effectiveDateTime": "2023-01-01T00:00:01"
}
]
}
一旦声明了oneToMany关系,实体将在调用getTable方法时加载所有连接的实体(序列化时jackson会调用该方法)。我相信如果您激活调试模式,您将看到2个请求,第一个是您在repopitory中描述的请求,第二个是JPA用于加载所有相关table2实体的请求。
他们提供了一些可能的方法来实现您的目标:
希望这有帮助!