我想使用jpa排除子实体中的一些字段。 例如:
Class Person extends Serializable
{
private String firstName;
private String lastName;
private String id;
private PersonalInformation personalInformation;
}
Class PersonalInformation extends Serializable
{
private Date dob;
private List<PersonalDocument> documents;
}
Class PersonalDocument extends Serializable
{
private String fileName;
private int fileSize;
private byte[] fileData;
}
当我试图获取某个人的详细信息时,我可以获得有关某个人的所有信息,包括PersonalInformation和PersonalDocument列表,但由于PersonalDocument.fileData可能很大,因此每次从DB获取此字段都会影响性能
所以我想在阅读时忽略/排除PersonalDocument.fileData字段,我想知道如何编写jpa查询。
答案 0 :(得分:0)
然后,一种解决方案是延迟提取文件数据,即在访问该字段时根据需要从数据库中提取。请注意,JPA规范不要求提供程序实现实际上支持单个字段(而不是关联)的延迟加载:此区域中的任何指令只能被视为对持久性提供程序的提示。
我知道Hibernate确实支持延迟加载字段,并且在这方面有很多类似的问题,但是我无法找到关于确切需要的确定答案。
首先,您需要使用@ Lob
注释(http://docs.oracle.com/javaee/6/api/javax/persistence/Lob.html)标记字段
import javax.persistence.Lob;
public class PersonalDocument implements Serializable
{
private String fileName;
private int fileSize;
@Basic(fetch=LAZY) //optional??
@Lob
private byte[] fileData;
}
以下表明默认情况下@Lob
是懒惰的,因此我们可能不需要额外的@Basic(fetch=LAZY)
,但无论如何都不会有任何伤害。
https://hibernate.atlassian.net/browse/ANN-418
虽然一些类似的Stack Overflow问题似乎报告说,添加@Lob
是延迟加载这些字段所需的全部内容,但Hibernate文档本身注意到延迟字段加载需要字节码增强。
https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
要启用属性级别的延迟抓取,您的类必须是 检测:将字节码添加到原始类以启用此类 功能,请参考Hibernate参考文档。如果 你的类没有检测,属性级延迟加载是 默默地忽略了。
所以,总结一下:
https://docs.jboss.org/hibernate/orm/5.0/topical/html/bytecode/BytecodeEnhancement.html