#hibernate #orm #jpa #jpql #hibernate-mapping
#переход в спящий режим #orm #jpa #jpql #переход в спящий режим -сопоставление
Вопрос:
Мое отображение сущностей выглядит следующим образом:
public class EntertainmentContentBean implements Serializable, Cloneable {
.
.
.
@ManyToMany
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@JoinTable(schema = "etmt", name = "content_operator", joinColumns = @JoinColumn(name = "content_id"), inverseJoinColumns = @JoinColumn(name = "operator_id"))
public Set<Operator> getOperators() {
return operators;
}
.
.
.
}
У меня есть конкретное требование, при котором я хочу извлекать записи EntertainmentContentBean на основе следующих критериев:
- Если нет записей оператора
- Если присутствуют записи оператора, то список операторов должен содержать объект operator, переданный параметром
Я попробовал следующий запрос, но он не возвращает ожидаемые записи:
SELECT NEW MAP (content AS content, id AS record_id)
FROM EntertainmentContentBean contentEntry
WHERE (contentEntry.operators is empty or (select op from Operator op where lower(op.key) = lower(:operator)) MEMBER OF contentEntry.operators))
Комментарии:
1. Что, собственно, не так? Какие записи возвращаются?
2. Записи представляют собой декартово соединение с таблицей contentEntry.operators
Ответ №1:
Я не уверен, что именно не так с этим запросом, но я бы посоветовал вам переписать его в более простой форме, возможно, это помогло бы:
SELECT DISTINCT NEW MAP (ce.content AS content, ce.id AS record_id)
FROM EntertainmentContentBean ce LEFT JOIN ce.operators op
WHERE op IS NULL OR lower(op.key) = lower(:operator)
Комментарии:
1. Привет .. это, безусловно, упрощает запрос, но результат все тот же … : (
Ответ №2:
В итоге я использовал подзапрос для получения желаемых результатов.