我有以下三个实体:
父:
@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]}
关于第一个问题——为了避免无限递归,只需在每个“子”集合中添加注释@JsonIgnoreProperties,例如:
@JsonIgnoreProperties("parent")
private List<Child> children;
@JsonIgnoreProperties("child")
private List<GrandChild> grandChildren;
因此,给定一个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