在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中以某种方式完成,还是唯一的机会?
答案 0 :(得分:1)
您可以使用Hibernate ResultTransformer
(例如AliasToBeanResultTransformer)根据需要返回自定义投影(POJO)。
以下链接应该可以帮助您理解我的意思。
答案 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();
}
}