我是关系数据库的新手,并且在创建查询时遇到一些问题。首先,我想尽快解释一下情况。我有几个实体类。它们都扩展了AbstractEntity
或EntityProperty
。因此,实体可以具有属性,而属性具有拥有的实体,因此存在双向关系。
现在让我们说ConcreteEntity
扩展了AbstractEntity
,我想创建这样的查询:获取ConcreteEntity
类型的所有实体,该实体至少具有on属性,名称包含在给定列表propertyNames
中。到目前为止,我有以下工作条件查询:
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实体”,在这里我也不知道如何以仅返回特定类型的方式编写它...
预先感谢您的答复!
编辑:将第二个问题移到criteria query: indistinct result lists并在代码中删除了不重复的代码(无效)
最佳答案
我知道这是一个古老的问题,但是以防万一有人偶然发现了相同的问题,这是如何解决的。
您可以像这样通过实体类型轻松过滤:
Predicate p = cb.equal(entity.type(), cb.literal(ConcreteEntity.class));
其中实体可以是路径(包括根和联接), cb 是CriteriaBuilder对象。因此,在您的情况下,将是这样的:
CriteriaQuery<AbstractEntity> cq = cb.createQuery(AbstractEntity.class);
Root<EntityProperty> property = cq.from(EntityProperty.class);
Join<EntityProperty, AbstractEntity> entity = property.join(EntityProperty_.owningEntities);
cq.where(cb.and(
property.get(EntityProperty_.name).in((Object[]) propertyNames),
cb.equal(entity.type(), cb.literal.ConcreteEntity.class)
));
cq.select(entity);