Criteria API:按类类型过滤

我是关系数据库的新手,我在创建查询方面遇到了一些问题。 首先,我想尽快解释一下情况。 我有几个实体类。 所有这些都扩展了AbstractEntityEntityProperty 。 因此实体可以拥有属性和属性拥有实体,因此存在双向关系。
现在让我们说ConcreteEntity扩展AbstractEntity并且我想创建这样的查询:获取ConcreteEntity类型的所有实体,其至少具有包含在给定列表propertyNames的名称的propertyNames 。 到目前为止,我有以下工作条件查询:

 CriteriaQuery cq = cb.createQuery(AbstractEntity.class); Root property = cq.from(EntityProperty.class); Join entity = property.join(EntityProperty_.owningEntities); cq.where(property.get(EntityProperty_.name).in((Object[]) propertyNames)); cq.select(entity); 

但现在我只想要那些ConcreteEntity类型的实体。 我怎么能实现这个目标? 在JPQL中我写了“SELECT entity FROM EntityProperty property JOIN property.owningEntities entity”,在这里我也不知道如何以只返回特定类型的方式编写它…

提前谢谢你的答案!

编辑:将第二个问题移到条件查询:隐隐绰绰的结果列表并删除代码中的不同(不起作用)

我知道这是一个古老的问题,但万一有人偶然发现同样的问题,以下是如何解决的问题。 您可以按照以下实体类型轻松过滤:

 Predicate p = cb.equal(entity.type(), cb.literal(ConcreteEntity.class)); 

其中entity可以是Path(包括Root和Join), cb是CriteriaBuilder对象。 所以在你的情况下它会是这样的:

 CriteriaQuery cq = cb.createQuery(AbstractEntity.class); Root property = cq.from(EntityProperty.class); Join 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); 

我到目前为止找到的唯一方法是为每个类创建一个带有值的枚举。生成的条件查询是

 CriteriaQuery cq = cb.createQuery(AbstractEntity.class); Root property = cq.from(EntityProperty.class); SetJoin entity = property.join(EntityProperty_.owningEntities); cq.where(property.get(EntityProperty_.name).in((Object[]) propertyNames), entity.get(AbstractEntity_.entityType).in(suitableSubTypes)); cq.select(entity); List resultList = em.createQuery(cq).getResultList(); 

如您所见,每个实体现在都具有属性entityType。 我还必须每次都创建collectionSubTypes集合。 另一个问题是返回的类型是List 。 我想要的是方法签名,如

 public static  List getEntities(Class entityClass, String... propertyNames) 

但是现在我有

 public static List getEntities(Collection suitableSubTypes, String... propertyNames) 

所以我仍然希望有更好的解决方案……