【问题标题】:Hibernate OneToMany mappingHibernate OneToMany 映射
【发布时间】:2012-11-30 03:44:42
【问题描述】:

我有两个模型类:Equity 和 EquityData。从 Equity 到 EquityData 存在 OneToMany 关系。我很难让 Hibernate 以我想要的方式绑定。

@Entity
@Table(name="equities")
public class Equity
{
    @Id
    @GeneratedValue
    @Column(name="Equity_ID")
    private Integer id;

    private String symbol;

    @OneToMany(mappedBy="equity")
    private List<EquityData> equityData;
    ...
}


@Entity
public class EquityData 
{   
    @Id
    @GeneratedValue
    @Column(name="id")
    private Integer id;

    @ManyToOne
    @JoinColumn(name="Equity_ID")
    private Equity equity;

    @Column(name="quote_time") private Date quoteTime;
    @Column(name="quote_type_id") private Integer quoteTypeId;
    @Column(name="value") private BigDecimal value;
    ...
}

现在一个 Equity 可以有多个 EquityQuotes,但总会有一个“最近的”报价(具有最新报价时间的报价)。现在,我将 Hibernate 绑定到我的实体的方式,它将检索 Equity 和所有 EquityData。我只希望它为每个 EquityDataType 检索最新的 EquityData(即我不关心昨天的数据,只关心今天的数据)。

在 SQL 中,它看起来像这样:

select d.equity_id, d.quote_type_id, d.value, max(quote_time) 
from equities e, equity_data d
where e.equityID = d.equity_id and e.symbol = :symbol
group by d.equity_id, d.quote_type_id;

如果有任何帮助,我将不胜感激!我认为这并不重要,但我在 Stripes Web 框架中使用它。

【问题讨论】:

标签: java hibernate jpa


【解决方案1】:

您可以在您的权益数据列表中将获取类型设置为 LAZY,然后编写一个命名查询并仅获取今天的权益数据。由于您使用的是 Hibernate,因此您也可以使用 Criteria API 来实现这一点。

【讨论】:

    【解决方案2】:

    您可以设置标准以从数据库中获取最新报价,例如,

    Criteria crit = session.createCriteria(Equity.class);
    //your criteria goes here....
    crit.createCriteria(last_quoted);
    List<?> entity = crit.list();
    for(Iterator<?> it = equity.iterator();it.hasNext();){
    Equity equity = (Equity) it.next();
    //print the latest quotes based on the criteria you provided
    }
    session.close();
    }
    //catch(Exception e){ //display exeption;}
    

    【讨论】:

      【解决方案3】:

      您可以创建另一个字段来仅恢复从今天开始的 EquityData,向其中添加 @Where 子句:

      @OneToMany(mappedBy = "equity")
      @Where(clause = "quoteTime >= TODAY")
      private List<EquityData> equityDataFromToday;
      

      然后,您必须使用字段EquityDataFromToday 来访问您的数据,而不是equityData(将包含所有这些数据)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-08
        • 2012-02-08
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多