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