2009-05-28 5 views
1

J'ai des classes avec des mappings comme ceci:externe gauche join fetch ne remplit pas correctement cartothèque (HQL)

@Entity 
public class CurrencyTable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private Long id; 

    @Version 
    @Column(nullable=false) 
    private Timestamp version; 

    @Column(length=32, unique=true) 
    private String refCode; 

    @OneToMany(mappedBy="currencyTable", fetch=FetchType.LAZY, cascade = {CascadeType.ALL}) 
    @MapKey(name="currency") 
    private Map<String, CurrencyTableRate> rateMap = new HashMap<String, CurrencyTableRate>(); 
} 

@Entity 
public class CurrencyTableRate{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private Long id; 

    @Version 
    @Column(nullable=false) 
    private Timestamp version; 

    @Column(length=3) 
    private String currency; 

    @Basic 
    private BigDecimal rateValue; 

    @ManyToOne(optional=false,fetch=FetchType.LAZY) 
    private CurrencyTable currencyTable; 
} 

Il y a une ligne dans CurrencyTable et trois lignes CurrencyTableRate se référant à la CurrencyTable base de données.

Quand je charge CurrencyTable à l'aide HQL:

from CurrencyTable where refCode = :refCode 

Je reçois une entité avec trois entrées rateMap, mais si j'essaie ceci:

from CurrencyTable table left outer join fetch table.rateMap where refCode = :refCode 

il n'y a qu'une seule entrée dans rateMap.

J'ai regardé la requête générée par Hibernate et l'ai exécutée manuellement - elle a renvoyé trois lignes, comme prévu, il semble donc que le problème soit de les mapper après la récupération. Quelqu'un at-il encombré un tel problème? J'utilise Hibernate version 3.2.6.ga et Oracle 10g

Répondre

0

Tout d'abord, je vous recommande d'ajouter un alias à refCode. Je ne pense pas que cela aura un impact sur le résultat, mais juste au cas où. Ensuite, activez votre code SQL et analysez ce qui se passe réellement au niveau SQL. J'ai eu des problèmes similaires avec HQL dans de tels cas

from CurrencyTable table left outer join fetch table.rateMap map where map.id = :id 

que je dois réécrire

from CurrencyTable table left outer join fetch table.rateMap map where EXISTS (SELECT a.id from CurrencyTable table a INNER JOIN a.rateMap m WHERE m.id = :id and table.id=a.id) 

espère que mes conseils vous aideront.

+0

J'ai ajouté des alias et cela n'a pas eu d'impact. Comme je l'ai écrit en question, j'ai regardé la requête SQL générée par Hibernate et l'ai exécuté manuellement - il a renvoyé trois lignes, comme prévu. J'ai utilisé une solution de contournement avec l'exécution de la première requête (sans extraire la jointure externe), puis en appelant Hibernate.initialize sur la carte. Comme c'est dans mon travail, je n'ai pas le temps de déboguer Hibernate pour savoir ce qui se passe mais un tel comportement me bouleverse :-) –

Questions connexes