我对关系数据库相对陌生,并且在创建查询方面遇到一些问题。首先我想简单地解释一下情况。我有几个实体类。它们都扩展了 AbstractEntity
或 EntityProperty
。因此实体可以拥有属性,属性也可以拥有实体,因此存在双向关系。
现在,假设 ConcreteEntity
扩展了 AbstractEntity
,我想创建如下查询:获取 ConcreteEntity
类型的所有实体,该实体至少具有一个名称包含在给定列表 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实体FROM EntityProperty属性JOIN property.owningEntities实体”,在这里我也不知道如何以仅返回特定类型的方式编写它......
感谢您的提前答复!
编辑:将第二个问题移至 criteria query: indistinct result lists并删除了代码中的不同内容(这不起作用)
最佳答案
我知道这是一个老问题,但以防万一有人偶然发现同样的问题,这里是解决方法。 您可以轻松地按实体类型进行过滤,如下所示:
Predicate p = cb.equal(entity.type(), cb.literal(ConcreteEntity.class));
其中实体可以是路径(包括Root和Join),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);
关于java - 标准 API : filter by class type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48748833/