当前位置: 首页 > 知识库问答 >
问题:

JavaSpring JPA参考,只从连接表返回一个结果

郦祯
2023-03-14

我相信下面的代码工作正常,但我的逻辑有缺陷,所以我正在寻求帮助以获得我真正想要的结果。此外,我认为我对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"
        }
    ]
}

共有1个答案

宋建柏
2023-03-14

一旦声明了oneToMany关系,实体将在调用getTable方法时加载所有连接的实体(序列化时jackson会调用该方法)。我相信如果您激活调试模式,您将看到2个请求,第一个是您在repopitory中描述的请求,第二个是JPA用于加载所有相关table2实体的请求。

他们提供了一些可能的方法来实现您的目标:

  • 第一个(也是最明显的?)是手动使2请求等效于您的HQL请求(表1按ID查找,然后是表2按…查找)然后将这两个结果相加
  • 第二种方法是使用jackson以您想要的方式序列化数据(通过过滤无用的表2数据)
  • 第三种方法是使用jackson将table2(提供相应的table1数据)序列化为适当的JSON。如果您的表1引用了大量的表2数据,可能会更加复杂,但效率可能会更高
  • 最后一种方法是尝试使用投影,它允许您在请求数据时仅声明要检索的数据

希望这有帮助!

 类似资料:
  • 这个问题是jOOQ的扩展:在单个对象中返回带有join、groupby和count的列表,但现在返回的是三个对象,而不是两个。 主意 具体示例 如何从查询中获取结果?

  • 所以我有两个表,并且有一个预期的行增量,但是这个增量不会返回,除非我使用左外连接。有人能帮我理解为什么查询1适用于这个用例,而查询2不适用:

  • 我尝试离线使用Android的语音识别API,就像这个问题一样,Android离线语音识别只显示一个结果?。我在线时也会得到五个结果,离线时只会得到一个结果,我希望在任何一种情况下都能得到五个(ish)结果。这仅仅是Android内置语音识别引擎的一个限制,还是有一些隐藏的设置可以更改以强制生成多个结果? 这是我的意图设置: 和我的onResults(): 我正在运行Android 4.4.2。

  • 我的数据库中有两个表: 表1:购买物品 表1列出了购买的物品,表2每小时更新一次每件物品的当前价格。因此,从表2中可以清楚地看出,肉类最后一次交易是在2013年2月20日上午10点,而鱼类不是在同一天交易的,它是在2013年2月19日上午9点交易的,鸡肉是在2013年2月20日上午9点交易的。我想做的是,列出表1中的所有项目,并加入表2中各个项目的最后交易价格,如下所示: 这里应该应用什么类型的连

  • 问题内容: 如果我有多个选择,例如: …如果第一个选择返回内容,我得到1个结果集。但是,如果运行第二个,我将得到两个结果集。第一个没有行,第二个没有行。 如果运行第二个选择,是否有办法仅返回第二个结果集? 谢谢! 问题答案: 您需要通过 在 运行选择 之前 检查是否会返回任何结果来阻止首次选择。 例如: