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

#hibernate #components #hql

#переход в спящий режим #Компоненты #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 инструкции [select upsalereas0_.id как id8_, увеличьте значение 0_.subject_id в качестве subject2_8_ из увеличенной причины увеличения значения 0_ перекрестного соединения ConversationCase conversati1_, где (conversati1_.subject_id в (выберите relatestor2_.category, увеличьте значение 2_.subject_id из увеличенной цены на_registered_reasons relatestor2_, где upsalereas0_.id=relatestor2_.UpSaleReason_id)) и conversati1_.id =?]

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

Ответ №1:

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

Похоже, что это должно быть elements(relatedReasons.subject)

Комментарии:

1. Извините, я указал неправильный HQL. Мне нужен этот выбор: выберите r из UpSaleReason как r, ConversationCase как cc, где cc.reason в элементах (relatedReasons) и cc.id = :id

2. Т.е. мне нужно сравнить по полной причине (тема И категория)

3. Я не уверен, что вы сможете использовать elements () с подобным составным ключом. Есть ли конкретная причина, по которой вы решили не указывать идентификатор причины? Это упростило бы запросы такого рода.

4. Причина в компоненте, поэтому у него нет идентификатора