我想使用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

10-04 10:48
查看更多