2016-07-14 16 views
1

Ich möchte ein UserReference-Objekt aus der Datenbank laden, aber aus dem Verifier-Attribut möchte ich nur die ID, firstName und lastName, so dass die userReference etwas aussehen würde dies wie:So laden Sie nur angegebene Attribute im Untergraphen in einem @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 
    } 
} 

habe ich für die UserReference Klasse ein Unternehmen graph, aber die, die ich verwendet, lädt alle Informationen, die der Benutzer, einschließlich der E-Mail, Benutzername, Büro und Abteilung. Gibt es eine Möglichkeit, etwas wie EntityGraphType.FETCH zum Untergraphen zu spezifizieren, so dass es nur die ID, firstName und lastName für den Verifier lädt?

Das ist mein UserReferenceRepository:

public interface UserReferenceRepository extends JpaRepository<UserReference, Long>{ 

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

Die UserReference Klasse:

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

und Benutzer:

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

Antwort

0

Ich nehme an, Sie Jackson verwenden JSON zu erzeugen. In diesem Fall handelt es sich um einen Kampf zwischen Jackson und Entity Graph und der ehemalige hat keine Chance, diesen Kampf zu gewinnen. Das Entitätsdiagramm ist nur ein Hinweis zum Erstellen einer SQL-Abfrage und Sie können Hibernate nur mitteilen, dass einige Attribute nicht geladen werden sollen. Hibernate unterstützt weiterhin keine Entitätsdiagramme, wenn grundlegende Entity-Felder geladen werden, siehe https://hibernate.atlassian.net/browse/HHH-9270. Aber das Hauptproblem ist, dass Jackson jeden Getter in Ihrer Entity während der JSON-Generierung aufruft und Hibernate wird sie faul laden, ohne Ihr Entity-Diagramm zu berücksichtigen. Ich kann nur die Verwendung von @JsonIgnore vorschlagen, aber das ist möglicherweise nicht so flexibel, wie Sie benötigen.