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

Spring JPA、Hibernate仅从其他实体获取PK或ID

拓拔高畅
2023-03-14

我有以下三个实体:
父:

@Setter
@Getter
@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String parentName;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, targetEntity = Child.class)
    private List<Child> children;
}

孩子:

@Setter
@Getter
@Entity
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String childName;

    @ManyToOne(targetEntity = Parent.class, cascade = CascadeType.MERGE)
    @JoinColumn(name = "parent_id")
    private Parent parent;

    @OneToMany(mappedBy = "child", cascade = CascadeType.ALL)
    private List<GrandChild> grandChildren;
}

孙子:

@Getter
@Setter
@Entity
public class GrandChild {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(cascade = CascadeType.MERGE, targetEntity = Child.class)
    @JoinColumn(name = "child_id")
    private Child child;
}

当我调用parentRepository时。findById(id),我会得到一个带着孩子和孙子孙女的父母。然而,这将导致两个问题:

>

  • 无限递归com.fasterxml.jackson.databind.JsonMappingExc0019:因为所有实体都包含对彼此的引用。

    来自Hibernate的不必要的查询,因为我的家长Dto只包含List

    是否有必要让Hibernate只从每个实体的引用中查询Id或PK,而不是获取整个对象?比如:

    Parent: {
      "parentName" : "Parent Name",
      "children" : [ {
        "id" : 0
      }, {
        "id" : 1
      }, {
        "id" : 2
      } ]
    }
    

    或:P家长:{"家长名":"家长名","儿童名":[0,1,2]}


  • 共有2个答案

    宰父疏珂
    2023-03-14

    关于第一个问题——为了避免无限递归,只需在每个“子”集合中添加注释@JsonIgnoreProperties,例如:

    @JsonIgnoreProperties("parent")
    private List<Child> children;
    
    @JsonIgnoreProperties("child")
    private List<GrandChild> grandChildren;
    
    訾渝
    2023-03-14
    匿名用户

    因此,给定一个parentId,您希望检索parentName,并且只检索相关的childID-

    与其通过parentRepository,我更愿意在childRepository添加一个带有@Query的新方法。方法和@Query如下所示:

    @Query("select c.parent.id, c.parent.parentName, c.id from Child c where c.parent.id = ?1")
    
    List<Object[]> findChildIdsByParentId(Long parentId);
    

    每个对象[]都将包含索引0处的父母身份、索引1处的父母身份和索引2处的儿童身份。

    一旦你有了这些数据,你就可以用符合你的json格式的DTO(杰克逊稍后会序列化)来填充这些数据。

     类似资料:
    • 我有一个名为Trade的实体,它可以映射到包含属性的表。这个实体也有一个字段,存储来自另一个表的值。我的贸易表包含第二个表的主键。我知道如何获得整个第二个表作为实体在我的贸易实体,但我只想要1列。 如你所见,我尝试了,但是连接是在贸易实体的主密钥上执行的。我如何使用注释从贸易表中选择外键,将其连接到第二/第三表,并直接只从col2/col3中获取值?任何建议都很感激 餐桌贸易: 表2: 表3: 现

    • 我如何通过我自己的API从另一个API获取PDF,然后到前面供用户下载。 我现在得到的只是一张空白页。 后面是Scala的,当我打印文件时,我得到一个字符串。

    • 我试图写这个来获取列表,我必须将ID列表作为参数传递: 我的实体是我用来查询的实体是: 但我在运行后遇到了以下异常: 有人能帮我用上面的方法获取列表吗?或者能告诉我我在这方面做错了什么。我不想使用本机,即(nativeQuery=true)使用这个。

    • 问题内容: 在我的项目中,我需要在运行时在数据库之间切换。我尝试使用Hibernate,但是卡在一个地方,我需要在数据库中映射对象和表。问题是,我有几个带前缀的表:documents2001,documents2002 …据我了解,我在运行时无法将类与表进行映射。我尝试使用iBatis,但问题出在运行时更改数据库。在iBatis中,这很难做到。 也许一些建议,我应该使用什么? 我的要求: 能够在运

    • 问题内容: 但是,首选解决方案(属性访问)在我的情况下不起作用(我缺少列异常-为什么?) 该模型如下所示:实体和。表含有列是的表,以便它是典型的关系。 现在的问题是,如果我取的实体,我需要有机会获得价值(亦称的实体),而不取实体。我怎样才能做到这一点? 我使用的映射如下所示: 我想做的是调用而无需从DB中额外获取实体。 根据我上面提到的答案,如果我将注释从字段移到getter(在实体上,我对吗?)

    • 我仍然是java和spring的初学者,我已经在mysql中存储了一个名为< code>Offers的表,我试图逐行获取数据< code >其中Status == 0,我的表看起来像这样: 当我尝试运行我的代码时,它的返回 org.springframework.beans.factory。BeanCreationException:创建在类路径资源[org/springframework/boo