休眠状态:仅获取ManyToOne关系的特定字段(不嵌入完整实体)

时间:2018-09-28 12:27:06

标签: hibernate many-to-one

在Hibernate中是否可以仅将异物的一个属性嵌入另一个实体,而不是整个对象?

这是我的问题:

@Entity
@Table(name = "ELEM")
public class Element {

    @Id
    private long id;

    @Column(name = "CODE")
    private String code;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "FOLDR_ID", nullable = false)
    private Folder folder;
}   

@Table(name = "FOLDR")
public class Folder {

    @Id
    private long id;

    @Column(name = "LABEL")
    private String label;

    // dozens of other columns
    // ...
}

这很好用,但是现在,在Element中,我只希望有标签,而不是完整的Folder对象。像这样:

@Entity
@Table(name = "ELEM")
public class Element {

    @Id
    private long id;

    @Column(name = "CODE")
    private String code;

    // HOW TO ANNOTATE THIS?
    private String folderLabel;
}

我为什么要这个?因为我认为这应该表现得更好。创建的对象更少,读取的列也更少。

我尝试使用@SecondaryTable,但了解到这仅适用于一对一关联,即Folder.id对应于Element.id,在这里不是这种情况。 / p>

这可以在Hibernate中以某种方式完成,还是唯一的机会?

3 个答案:

答案 0 :(得分:1)

您可以使用Hibernate ResultTransformer(例如AliasToBeanResultTransformer)根据需要返回自定义投影(POJO)。

以下链接应该可以帮助您理解我的意思。

https://vladmihalcea.com/why-you-should-use-the-hibernate-resulttransformer-to-customize-result-set-mappings/

答案 1 :(得分:0)

因此您可以定义自定义sql并为其添加连接语句。

query =“从tbl_element连接tbl_folder中选择id,代码,标签,其中tbl_element.folder_fk = tbl_folder.id”

如果您使用的是 entitymanager ,则可以执行类似的操作

entitymanager.createNativeQuery(query,Element.class).setParameter(..)。getResultList或getResult

public class Element { 

 private int id;
 private String code;
 private String folderlabel;

// getter setter

}

答案 2 :(得分:0)

    @Entity
    @Table(name = "ELEM")
    public class Element {

        @Id
        private long id;

        @Column(name = "CODE")
        private String code;

    //Model to get the @ManyToOne object. Do not use it yet, not directly atleast. Most of the times, it leads to Json Infinite Recursion
    @ManyToOne(bla bla) 
    @JsonIgnore
    private Map<K, V> folder 

    //Getters and Setters for folder. Use the @Transient method below for the required field to show up when you deserialize Json or other access methods. 

    //Solution:
        // HOW TO ANNOTATE THIS? Do not use it this way
        private String folderLabel;

//Get it this way
    @Transient 
    public String getFolderLabel(){
    return getFolder().getFolderName();
    }


    }