2012-11-30 4 views
4

J'ai deux classes de modèles: Equity et EquityData. Il existe une relation OneToMany de Equity à EquityData. J'ai du mal à faire en sorte que Hibernate se lie comme je le souhaite.Hibernate OneToMany mapping

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

maintenant Equity peut avoir beaucoup EquityQuotes, mais il y aura toujours une citation « le plus récent » (celui avec la dernière quoteTime). À l'heure actuelle, la façon dont j'ai Hibernate lier à mes entités, ça va récupérer l'Equity et tous les EquityData. Je veux seulement qu'il récupère les derniers EquityData pour chaque EquityDataType (c.-à-d. Je ne me soucie pas des données d'hier, juste aujourd'hui).

Dans SQL, il ressemblerait à ceci:

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; 

Je vous remercie de toute aide! Je ne pense pas que cela soit important, mais je l'utilise dans le cadre Web de Stripes.

+0

vous pouvez utiliser sqlquery en veille prolongée. utilise le. vérifier ceci http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/SQLQuery.html – KSHiTiJ

Répondre

0

Vous pouvez définir le type d'extraction comme LAZY sur votre liste de données d'équité, puis écrire une requête nommée et extraire uniquement les données d'équité actuelles. Puisque vous utilisez Hibernate, vous pouvez également le faire en utilisant l'API Criteria.

0

Vous pouvez définir un critère pour aller chercher la dernière citation de la base de données comme,

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

Vous pouvez créer un autre champ pour récupérer seulement le EquityData à partir d'aujourd'hui, en ajoutant une clause @Where à elle:

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

Ensuite, vous devez utiliser le equityDataFromToday sur le terrain pour accéder à vos données, au lieu de equityData (qui contiendra tous)