我想使用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查询。
最佳答案
然后一种解决方案是延迟访问文件数据,即,当您访问字段时从数据库中按需获取文件数据。请注意,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
虽然一些类似的堆栈溢出问题似乎报告说,添加
@Lob
是延迟加载此类字段所需的全部,但Hibernate文档本身注意到,延迟字段加载需要字节码增强。https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
要启用属性级别的延迟获取,您的类必须是
检测:将字节码添加到原始类以启用此类
功能,请参阅Hibernate参考文档。如果
您的类未检测,属性级别的延迟加载是
默默无视。
因此,总而言之:
添加@Lob,看看它是否有效。
如果不是,请添加@Basic(fetch = LAZY)并查看它是否有效。
如果没有,请在构建中添加字节码增强功能。
https://docs.jboss.org/hibernate/orm/5.0/topical/html/bytecode/BytecodeEnhancement.html