[英]Hibernate OneToMany mapping
我有两个模型类: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,但总会有一个“最新的”报价(带有最新quoteTime的报价)。 现在,我将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 Framework中使用它。
您可以在权益数据列表中将获取类型设置为LAZY,然后编写命名查询并仅获取今天的权益数据。 由于您使用的是Hibernate,因此您也可以使用Criteria API实现此目的。
您可以设置标准以从数据库中获取最新报价,例如:
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;}
您可以创建另一个字段以仅从今天恢复EquityData,向其添加@Where子句:
@OneToMany(mappedBy = "equity")
@Where(clause = "quoteTime >= TODAY")
private List<EquityData> equityDataFromToday;
然后,您必须使用字段equityDataFromToday来访问您的数据,而不是使用equityData(将包含所有这些)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.