Выборка левого внешнего соединения не заполняет коллекцию карт должным образом (HQL) - PullRequest
2 голосов
/ 28 мая 2009

У меня есть классы с такими сопоставлениями:

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

Существует одна строка в CurrencyTable и три строки в CurrencyTableRate, ссылающиеся на CurrencyTable в базе данных.

Когда я загружаю CurrencyTable с использованием HQL:

from CurrencyTable where refCode = :refCode

Я получаю сущность с тремя записями в rateMap, но если я попробую это:

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

В курсовой карте есть только одна запись.

Я посмотрел на запрос, сгенерированный Hibernate, и запустил его вручную - он вернул три строки, как и ожидалось, поэтому возникает проблема с отображением их после выборки. Кто-нибудь сталкивался с такой проблемой? Я использую Hibernate версии 3.2.6.ga и Oracle 10g

1 Ответ

0 голосов
/ 28 мая 2009

Прежде всего, я рекомендую вам добавить псевдоним в refCode. Не думаю, что это повлияет на результат, но на всякий случай.

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

Во-вторых, включите ваш код SQL и проанализируйте, что действительно происходит на уровне SQL. У меня были подобные проблемы с HQL в таких случаях

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

который я должен переписать на

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)

Надеюсь, мои подсказки помогут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...