#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. Причина в компоненте, поэтому у него нет идентификатора