JPA获取太多实体类对象,即使它不是rqquired

时间:2014-04-13 12:04:12

标签: java mysql entity-framework hibernate jpa

我一直致力于查询(提票)申请。 但应用程序性能很低。 在我的应用程序中,我有两个要求(概述页面,详细信息页面)。 每当我们打开应用程序时,它必须显示当前在概述页面中分配给该用户的打开票证(enquireis)。 概述页面包含10条记录的分页。 这里的每条记录都有一个链接来查看其详细信息(详细页面)。 我们正在使用JPA和wicket技术。

每当我们打开应用程序时, 概述页面必须显示几个已映射到五个实体类中的少数字段的字段数据。 这里的主要实体类是Inquiry,其中有其他实体映射到User, 公司, 经销商, 问题, EnquiryText。

因此,当我打开我的应用程序时,它需要所有这些实体中的少量字段数据。 但JPA正在加载映射到Inquiry类的所有实体中的所有字段。 最糟糕的部分是查询实体中的其他实体也映射到其他一些实体。

Select enquiry.,enquiry.user.*,enquiry.company.*,
      enquiry.issue.*,enquiry.dealer.*,enquiry.enquiryText.*     
from 
Enquiry enquiry
      where ( enquiry.* = input value, enquiry.issue.* = input value   )

我还有其他要求,当我点击概述页面中的每个记录时,它应该获取该记录的所有细节。 因此,在这种情况下,它必须获取所有实体。

Select enquiry  
from Enquiry enquiry 
where ( enquiry.* = input value, enquiry.issue.* = input value  )

我们是否可以让我们的应用程序停止获取所有实体 但在一个要求中获取几个实体字段(同时显示概述页面)  并使其获取其他要求中的所有实体字段(当我们点击每个记录,即票据时)?

@Entity
@Table(name = "ENQRY")
public class Enquiry extends AbstractEntity {
@Id
@Column(name = "CONT")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "EMAILADRADD")
private String emailAddresses = "";
@Column(name = "CONFIHME")
private String Comments = "";
@Column(name = "STCONT")
private DateTime lastStatusChangeOn = new DateTime();
@Column(name = "CLANGOPTR")
private String operatorLanguage;
@Column(name = "CLANGISS")
private String issuerLanguage;

@ManyToOne
@JoinColumn(name = "USERLUPD")
private User lastUpdateByUser;
@ManyToOne
@JoinColumn(name = "USERCREAT")
private User createdByUser;
@ManyToOne
@JoinColumn(name = "USERISS")
private User issuer;

@ManyToOne
@JoinColumn(name = "CMPY")
private Company company;


@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "enquiry", fetch = FetchType.EAGER)
@Where(clause = "CTEXT = 'DIAGN'")
private List<EnquiryText> diagnosis;        
@OneToMany(fetch = FetchType.LAZY, mappedBy = "enquiry")
private List<EnquiryText> texts;

1 个答案:

答案 0 :(得分:2)

这个问题没有一个解决方案。我想到的有两个:

  1. 创建数据库视图,然后将自定义实体映射到此视图(请记住视图是只读的)
  2. 创建DTO课程,然后制作select new dtopackege.myDto(e.field, e.field1, e.field2, e.field3.subfield) from MyEntity e
  3. 您的DTO必须具有能够初始化查询传递的所有参数的构造函数。

    然后根据您的要求,您可以选择调用自定义方法,或者只选择将获取所有属性的hibernate普通方法。

    希望这有帮助!