Java 如何在@NamedEntityGraph中仅加载子图中的指定属性
我想从数据库中加载UserReference对象,但从verifier属性中,我只想加载id、firstName和lastName,这样UserReference看起来像这样:Java 如何在@NamedEntityGraph中仅加载子图中的指定属性,java,hibernate,lazy-loading,spring-data-jpa,entitygraph,Java,Hibernate,Lazy Loading,Spring Data Jpa,Entitygraph,我想从数据库中加载UserReference对象,但从verifier属性中,我只想加载id、firstName和lastName,这样UserReference看起来像这样: { "id": 1, "company": "company1", "companyContactName": "some name", "companyPosition": "programmer", "referenceDate": "02/04/2005", "verifier": {
{
"id": 1,
"company": "company1",
"companyContactName": "some name",
"companyPosition": "programmer",
"referenceDate": "02/04/2005",
"verifier": {
"id":1
"firstName": "Jane",
"lastName": "Smith"
"email":null,
"username":null,
"office:null,
"department":null
}
}
我为UserReference类使用了一个实体图,但我使用的实体图加载了用户拥有的所有信息,包括电子邮件、用户名、办公室和部门。
有没有办法将EntityGraphType.FETCH之类的东西指定给子图,以便它只加载验证器的id、firstName和lastName
这是我的用户参考假设:
public interface UserReferenceRepository extends JpaRepository<UserReference, Long>{
@EntityGraph(value = "userReferenceGraph" , type = EntityGraphType.FETCH )
UserReference findOne(Long id);
}
和用户:
@Getter @Setter
@EqualsAndHashCode(exclude = {"id", "department", "company", "authorities", "hrDetails"})
@ToString(exclude = {"password"})
@Entity
@AllArgsConstructor
@Builder
public class User implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Access(value = AccessType.PROPERTY)
private Long id;
@Size(max = 50)
@Column(name = "first_name", length = 50)
private String firstName;
@Size(max = 50)
@Column(name = "last_name", length = 50)
private String lastName;
@Column(length = 100, unique = true, nullable = false)
private String email;
@Column(length = 50, unique = true, nullable = false)
private String username;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private Department department;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "office_id")
private Office office;
}
我想您正在使用Jackson生成JSON。在这种情况下,这是一场杰克逊与实体图的战斗,前者没有机会赢得这场战斗。实体图只是构建SQL查询的提示,您只能告诉Hibernate不要加载某些属性。Hibernate在加载基本实体字段时仍然不支持实体图,请参阅。但主要的问题是Jackson会在JSON生成过程中调用实体中的每个getter,Hibernate会在不考虑实体图的情况下延迟加载它们。我只能建议使用@JsonIgnore,但这可能没有您需要的那么灵活。我遇到了同样的问题,我看到了两种解决方法: 快速: 您可以在实体中执行一些@PostLoad操作,并将不需要的字段置空
@PostLoad
private void postLoad() {
if (verifier != null) {
verifier.email = null;
verifier.office = null;
verifier.department = null;
}
}
正确:
另一种方法是通过将实体转换为DTO来保护实体。创建单独的POJO,并将用户和用户引用转换为该DTO POJO类。在那里,你肯定会对自己的反应有更多的控制权
@PostLoad
private void postLoad() {
if (verifier != null) {
verifier.email = null;
verifier.office = null;
verifier.department = null;
}
}