Невозможно построить запрос HQL, который связывает сущности, связанные через «содержащиеся в отношении коллекции элементов»

У меня есть следующие классы/сопоставления в моей модели:

@Entity
public class UpSaleReason {
    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne
    private Subject subject;

    @ElementCollection
    private Set<Reason> relatesToRegisteredReasons;
}

@Embeddable
public class Reason {
    @ManyToOne
    private Subject subject;

    @Enumerated(value = EnumType.STRING)
    private Category category;
}

@Entity
public class Subject {
    @Id
    private Long id;
    private String name;
}


@Entity
public class ConversationCase {
    @Id
    private Long id;

    @Embedded
    private Reason reason;
}

и пытаюсь выполнить этот HQL:

select r from UpSaleReason as r, ConversationCase as cc
where cc.reason in elements(relatedReasons) and cc.id = :id

что дает мне:

... Вызвано: java.sql.SQLException: выбор одного столбца требуется в предикате IN в выражении [выберите upsalereas0_.id как id8_, upsalereas0_.subject_id как subject2_8_ из UpSaleReason upsalereas0_ перекрестное соединение ConversationCase conversati1_ где (conversati1_.subject_id в (выберите relatedstor2_ .category, referstor2_.subject_id из up_sale_to_registered_reasons, relatedstor2_ где upsalereas0_.id=relatestor2_.UpSaleReason_id)) и conversati1_.id=?]

Что мне делать, чтобы связать два объекта в HQL, которые относятся друг к другу через отношение, которое можно описать как «значение свойства компонента одного объекта должно содержаться в ElementCollection другого»?


person Den Orlov    schedule 25.05.2011    source источник


Ответы (1)


Проблема заключается в in elements(relatedReasons), который генерирует внутренний оператор выбора для полного объекта причины, как с категорией, так и с субъектом.

Вроде так и должно быть elements(relatedReasons.subject)

person Stevi Deter    schedule 25.05.2011
comment
Извините, я дал неправильный HQL. Мне нужен этот выбор: выберите r из UpSaleReason как r, ConversationCase как cc, где cc.reason в elements(relatedReasons) и cc.id = :id - person Den Orlov; 26.05.2011
comment
т.е. Мне нужно сравнить по полной причине (тема И категория) - person Den Orlov; 26.05.2011
comment
Я не уверен, что вы сможете использовать elements() с таким составным ключом. Есть ли конкретная причина, по которой вы решили не указывать идентификатор в Reason? Это упростило бы такие запросы. - person Stevi Deter; 26.05.2011
comment
Reason является компонентом, поэтому у него нет идентификатора - person Den Orlov; 28.05.2011