Я отношусь к новым реляционным базам данных, и у меня есть некоторые проблемы, связанные с созданием запросов. Сначала я хочу коротко объяснить ситуацию. У меня есть несколько классов сущностей. Все они распространяются на AbstractEntity
или EntityProperty
. Таким образом, объекты могут иметь свойства и свойства, имеющие собственные объекты, поэтому существует двунаправленное отношение.
Теперь предположим, что ConcreteEntity
расширяет AbstractEntity
, и я хочу создавать запросы следующим образом: Получить все сущности типа ConcreteEntity
, который имеет как минимум свойство с именем, содержащимся в данном списке propertyNames
. До сих пор я иметь следующий рабочий критерии запроса:Критерии API: фильтр по типу класса
CriteriaQuery<AbstractEntity> cq = cb.createQuery(AbstractEntity.class);
Root<EntityProperty> property = cq.from(EntityProperty.class);
Join<EntityProperty, AbstractEntity> entity = property.join(EntityProperty_.owningEntities);
cq.where(property.get(EntityProperty_.name).in((Object[]) propertyNames));
cq.select(entity);
Но сейчас я хочу только те объекты типа ConcreteEntity
. Как я мог это достичь? В JPQL я написал «SELECT entity FROM EntityProperty свойство JOIN property.owningEntities entity», и здесь я также не знаю, как записать его так, как только возвращается конкретный тип ...
Спасибо за ответы заранее !
EDIT: переместил второй вопрос criteria query: indistinct result lists и удалить различны в коде (который не работал)
что делать, если у вас был этот параметр параметризирован с использованием дженериков? Тогда вы могли бы сказать, хотите ли вы, чтобы AbstractEntity или ConcreteEntity во время компиляции (не уверен, что это имеет смысл) – Leo
Я могу это сделать, когда я определяю сущности как root. Тогда я могу осмысленно определить класс. Проблема здесь в том, что я получаю доступ к объектам через атрибут 'owningEntities' свойств фитинга. И этот атрибут имеет тип List. –
Jogi