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

标签 java mysql entity-framework hibernate jpa

我一直在处理查询(票务筹集)应用程序。 但应用性能较低。 我的应用程序中有两个要求(概览页面、详细信息页面)。 每当我们打开应用程序时,它都必须在概览页面中显示当前分配给该用户的开放票证(查询)。 概览页面有 10 条记录的分页。 这里每条记录都有一个链接来查看其详细信息(详细信息页面)。 我们正在使用 JPA 和 wicket 技术。

每当我们打开应用程序时, 概览页面必须显示已映射到五个实体类中的几个字段的几个字段数据。 这里主要的实体类是查询,它有其他实体映射到它,比如用户, 公司, 经销商, 问题, 查询文本。

因此,当我打开我的应用程序时,它需要所有这些实体中的少量字段数据。 但是 JPA 正在加载映射到 Inquiry 类的所有实体中的所有字段。 最糟糕的是 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. 创建数据库 View ,然后将自定义实体映射到该 View (记住 View 是只读的)
  2. 创建一个 DTO 类,然后创建一个 select new dtopackege.myDto(e.field, e.field1, e.field2, e.field3.subfield) from MyEntity e

您的 DTO 必须具有能够初始化查询传递的所有参数的构造函数。

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

希望这对您有所帮助!

关于java - JPA 获取太多的实体类对象,即使它不是 rqquired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23042503/

相关文章:

java - 在Java中打印二维数组 radio

java - 到处使用 `final` 修饰符的开源 Java 项目

java - eclipse中Tomcat上使用JDBC for MYSQL时出现classNotFound异常

mysql - 从 MySQL 获取最大不同值

c# - .Net Core Connection 目前有事务登记

asp.net - 将 ASP.NET 动态数据筛选与 Entity Framework 结合使用时出错

java - Apache 公地|池或池 2

mysql - MySql中的百分号

c# - 数据集表复制错误

oracle - DevArt 的 dotConnect for Oracle 与 DataDirect 的 ADO.NET 数据提供程序