1
技术:JPA,eclipseLink,postgreSQL。JPA渴望满足条件
我正在寻找一个很好的方式来解决问题,我有:
我的数据模型包含一个雇员的实体,具有与实体的任务,具有的startDate和结束日期的一个一对多的关系(和一些更多的属性)。 当我加载员工时,我总是也需要这些任务,所以我已经设置了fetchtype以使其渴望。 问题是,应用程序的使用时间越长,员工引用的任务越多,但大多数都是过去的(远)。
因此,为了防止应用程序的性能受到影响,我正在寻找基于JPA注释的方式来为fetchtype定义条件,在这种情况下,我只想为雇员加载具有endDate的任务在最后的午夜之后。
我找到了注解@PostLoad(请参阅下面的代码)的解决方案,但我想知道是否有可能对该字段上的注释执行相同的操作。
在你看来,最好的方法是什么?
感谢您的帮助!
@Entity
@Table(name = "tbl_employee")
public class Employee implements Serializable {
//... (attributes)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "employee")
private List<Task> tasks;
@PostLoad
public void loadTasks() {
tasks = new TaskDao().getTasksByEmployeeByToday(this);
}
//... (getters, setters)
}
@Entity
@Table(name = "tbl_task")
public class Task implements Serializable {
//... (attributes)
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "fi_employee", referencedColumnName = "id_employee")
private Employee employee;
@Column(name = "start_date", nullable = true)
private Timestamp startDate;
@Column(name = "end_date", nullable = true)
private Timestamp endDate;
//... (getters, setters)
}
public class TaskDao extends GenericDaoCRUD<Task> {
public List<Task> getTasksByEmployeeByDate(Employee employee, Timestamp date) {
Timestamp lastMidnight = Utils.getLastMidnight(date);
String statement = "SELECT t FROM Task t WHERE t.employee = :employee and t.endDate > :enddate";
TypedQuery<Task> query = getEntityManager().createQuery(statement, Task.class);
query.setParameter("employee", employee);
query.setParameter("enddate", lastMidnight);
try {
return query.getResultList();
} catch (NoResultException e) {
LOG.info("No tasks found for employee=" + employee + "; and date>"
+ lastMidnight);
}
return null;
}
public List<Task> getTasksByEmployeeByToday(Employee employee) {
return getTasksByEmployeeByDate(employee, new Timestamp(System.currentTimeMillis()));
}
至少JPA 2标准没有这样的注释。你可能有更多的运气提供商特定的注释.Hibernate提供了很多。 – kostja