gpt4 book ai didi

java - 标准 API : filter by class type

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:52 26 4
gpt4 key购买 nike

我对关系数据库相对陌生,并且在创建查询方面遇到一些问题。首先我想简单地解释一下情况。我有几个实体类。它们都扩展了 AbstractEntityEntityProperty。因此实体可以拥有属性,属性也可以拥有实体,因此存在双向关系。
现在,假设 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com