简体   繁体   English

Hibernate OneToMany映射

[英]Hibernate OneToMany mapping

I have two model classes: Equity and EquityData. 我有两个模型类:Equity和EquityData。 There is a OneToMany relationship from Equity to EquityData. 从Equity到EquityData有一个OneToMany关系。 I'm having a hard time getting Hibernate to bind the way I want it to. 我很难让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;
    ...
}

Now an Equity can have many EquityQuotes, but there will always be a "most recent" quote (the one with the latest quoteTime). 现在一个Equity可以有很多EquityQuotes,但总会有一个“最新的”报价(带有最新quoteTime的报价)。 Right now, the way I have Hibernate bind to my entities, it'll retrieve the Equity and all the EquityData's. 现在,我将Hibernate绑定到我的实体的方式,它将检索Equity和所有EquityData。 I only want it to retrieve the latest EquityData for each EquityDataType (ie i dont care about yesterday's data, just today's). 我只希望它为每个EquityDataType检索最新的EquityData(即我不关心昨天的数据,只是今天的数据)。

In SQL, it would look like this: 在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;

I'd appreciate any help! 我很感激任何帮助! I don't think it matters, but I'm using this in the Stripes Web Framework. 我认为这不重要,但我在Stripes Web Framework中使用它。

You can set the fetch type as LAZY on your equity data list and then write a named query and fetch only today's equity data. 您可以在权益数据列表中将获取类型设置为LAZY,然后编写命名查询并仅获取今天的权益数据。 Since you are using Hibernate, you can achieve this using the Criteria API as well. 由于您使用的是Hibernate,因此您也可以使用Criteria API实现此目的。

You can set a criteria to fetch the latest quote from the database like, 您可以设置标准以从数据库中获取最新报价,例如:

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;}

You can create another field to recover only the EquityData from today, adding an @Where clause to it: 您可以创建另一个字段以仅从今天恢复EquityData,向其添加@Where子句:

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

Then, you must use the field equityDataFromToday to access your data, instead of equityData (which will contain all of them) 然后,您必须使用字段equityDataFromToday来访问您的数据,而不是使用equityData(将包含所有这些)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM