使用JPA,我可以在从数据库加载对象后运行查询吗?
例如,我有一个具有此字段的实体:
@OneToMany(mappedBy = "widget", fetch = FetchType.EAGER, cascade = {})
@OrderBy("happenedDate DESC")
public List<Widget> getWidgets() {
return widgets;
}
这将仅加载所有关联的小部件。我真正想要的是结果集中前20个happenedDate
的订单。是否有注释可以指定在从DB加载对象后运行的方法,因此我可以运行查询并获得有限的结果,如:
@AfterDataLoaded
List<Widget> loadLast20WidgetsWidgets(){
// Do query here
}
这个注释或模式是否存在?
答案 0 :(得分:2)
您可以结合使用@EntityListener(类级别)和@PostLoad(方法级别)来实现目标。
答案 1 :(得分:1)
您可以使用特定于Hibernate的非JPA兼容@Where
注释来实现此目的,该注释采用本机sql子句来限制加载到关联集合的结果。
此查询的外观取决于您对LIMIT,TOP等的数据库支持。
@OneToMany(mappedBy = "widget", fetch = FetchType.EAGER, cascade = {})
@OrderBy("happenedDate DESC")
@Where(clause = "id in (select top 20 id from table_name order by some_field desc)")
public List<Widget> getLast20Widgets() {
return widgets;
}
答案 2 :(得分:0)
没有注释来限制所提取记录的数量。要实现这一点,您必须运行JPA查询,这将是微不足道的。
答案 3 :(得分:0)
这是不可能的,因为JPA / Hibernate必须管理从transition
到persistent
州的整个集合removed
。
你可以使用以下替代品:
1.HQL or Native SQL
2.Criteria Query