Сбой нескольких объединений выборки JQPL с Hibernate

Используя Hibernate 3.6.7 и JPA 2, я не могу иметь два объединения выборки в одном запросе. Объект имеет самоссылающееся поле, называемое родительским. localizedTexts — это @ElementCollection карты типа Java. entity.getParent() имеет @ManyToOne со стратегией загрузки EAGER.

Вот как выглядит сущность:

@Entity
public class Entity extends BaseEntity {
    /* ... */

    @ManyToOne(fetch = FetchType.EAGER)
    public Entity getParent() {
        return parent;
    }

    @ElementCollection
    @MapKeyColumn(name = "language")
    @Column(name = "text")
    public Map<String, String> getLocalizedTexts() {
        return localizedTexts;
    }

    /* ... */
}

Следующие два запроса работают:

select e from Entity e join fetch e.parent.localizedTexts

select e from Entity e join fetch e.localizedTexts

Но это не работает:

select e from Entity e join fetch e.localizedTexts join fetch e.parent.localizedTexts 

Спящий режим жалуется: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,collection join,fetch join,fetch non-lazy properties,classAlias=null,role=net.company.project.Entity.localizedTexts,tableName={none},tableAlias=localizedt3_,origin=null,columns={,className=null}}] [select e from net.company.project.Entity e join fetch e.localizedTexts join fetch e.parent.localizedTexts]


person Mohsen    schedule 25.09.2011    source источник


Ответы (1)


Если вы хотите предварительно загрузить "родительские" ассоциации сущностей, а также родительскую ассоциацию "localizedTexts", вы должны объявить соединения, которые пересекают дерево модели в правильном порядке:

select e from Entity e join fetch e.parent p joint fetch p.localizedTexts
person Shivan Dragon    schedule 25.09.2011
comment
Нет разницы. То же исключение выдается для этого запроса: выберите e из Entity e join e.parent p join fetch e.localizedTexts join fetch p.localizedTexts - person Mohsen; 27.09.2011
comment
Если у вас есть ассоциация OneToMany или oneTOOne от e к родительскому объекту и onetoMany от родительского объекта к localizedTexts, то указанное выше соединение должно работать. Пожалуйста, опубликуйте фрагмент кода этих bean-компонентов и их связи между ними. - person Shivan Dragon; 28.09.2011
comment
как упоминалось ранее, localizedTexts — это MapKeyColumn, а в getParent() есть ManyToOne. - person Mohsen; 28.09.2011