JPA 2.1加载对象后加载额外数据

时间:2016-05-27 03:11:05

标签: java hibernate jpa

使用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
}

这个注释或模式是否存在?

4 个答案:

答案 0 :(得分:2)

您可以结合使用@EntityListener(类级别)和@PostLoad(方法级别)来实现目标。

答案 1 :(得分:1)

您可以使用特定于Hibernate的非JPA兼容@Where注释来实现此目的,该注释采用本机sql子句来限制加载到关联集合的结果。

https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection

此查询的外观取决于您对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必须管理从transitionpersistent州的整个集合removed

你可以使用以下替代品:

1.HQL or Native SQL

2.Criteria Query