簡體   English   中英

Hibernate OneToMany映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM