2012-11-30 201 views
4

我有两个模型类:Equity和EquityData。从股票到股票数据有一对一的关系。我很难让Hibernate以我想要的方式绑定。Hibernate OneToMany映射

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

现在的股票可以有很多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中使用它。

+0

您可以在使用休眠sqlquery的。用它。检查这个http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/SQLQuery.html – KSHiTiJ

回答

0

您可以在您的权益数据列表上将获取类型设置为LAZY,然后编写命名查询并只提取今天的权益数据。既然你使用Hibernate,你也可以使用Criteria API来实现这一点。

0

您可以设置一个标准,从数据库中获取类似的最新报价,

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

您可以创建另一场只恢复从今天EquityData,添加@Where条款给它:

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

然后,你必须使用领域equityDataFromToday访问您的数据,而不是equityData(其中将包含所有的人)