2016-07-14 18 views
1

データベースからUserReferenceオブジェクトをロードしたいが、verifier属性から、id、firstName、lastNameだけをロードして、userReferenceが何かを表示するようにしたいこのように:@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がJSON生成時にEntity内のすべてのゲッターを呼び出し、Hibernateがエンティティグラフを考慮しないでそれらを読み込むことです。私は@JsonIgnoreの使用法しか提案できませんが、それはあなたが必要とするほど柔軟ではないかもしれません。

関連する問題