2016-07-14 4 views
1

데이터베이스에서 UserReference 개체를로드하려고하지만, verifier 특성에서 userReference가 무엇인가 보일 수 있도록 id, firstName 및 lastName 만로드하려고합니다. 같은 :@NamedEntityGraph의 하위 그래프에 지정된 속성 만로드하는 방법

{ 
    "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 만로드 할 수 있습니까? 난 당신이 JSON을 생성 잭슨을 사용하는 가정

@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; 
} 

답변

0

:

public interface UserReferenceRepository extends JpaRepository<UserReference, Long>{ 

    @EntityGraph(value = "userReferenceGraph" , type = EntityGraphType.FETCH) 
    UserReference findOne(Long id); 
} 

UserReference 클래스 :

@Getter 
@Setter 
@EqualsAndHashCode (exclude = {"id", "verifier"}) 
@ToString(exclude = {"id"}) 
@Entity 
@NamedEntityGraphs({ 
    @NamedEntityGraph(
     name = "userReferenceGraph",  
     attributeNodes = { 
      @NamedAttributeNode(value = "verifier", subgraph = "verifierGraph") 
    }, 
    subgraphs = { 
     @NamedSubgraph( 
      name = "verifierGraph", 
      type = User.class, 
      attributeNodes = { 
       @NamedAttributeNode(value = "id"), 
       @NamedAttributeNode(value = "firstName"), 
       @NamedAttributeNode(value = "lastName")})}) 
}) 

public class UserReference { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "user_id", referencedColumnName = "user_id", foreignKey = @ForeignKey (name = "FK_UserReference_UserHRDetails_user_id")) 
    @JsonIgnore 
    private UserHRDetails hrDetails; 

    private String company; 
    private String companyContactName; 
    private String companyPosition; 
    private Date referenceDate; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "verifier_id") 
    private User verifier; 
} 

및 사용자

이 내 UserReferenceRepository입니다. 이 경우 전투 잭슨 대 엔티티 그래프이며 이전 플레이어는이 전투에서 승리 할 수있는 기회가 없습니다. 엔티티 그래프는 SQL 질의를 작성하는 힌트 일 뿐이며 Hibernate에게 일부 속성을로드하지 말 것을 알릴 수 있습니다. Hibernate는 기본 엔티티 필드를로드 할 때 엔티티 그래프를 여전히 지원하지 않습니다 (https://hibernate.atlassian.net/browse/HHH-9270 참조). 하지만 주요한 문제는 JSON 생성 과정에서 Jackson이 Entity의 모든 getter를 호출하고 Hibernate가 엔티티 그래프를 고려하지 않고로드하는 것을 지연한다는 것입니다. @JsonIgnore 사용법 만 제안 할 수 있지만 필요에 따라 유연하지 않을 수 있습니다.