java - 标准 API : filter by class type

标签 java sql jpa-2.0 jpql criteria-api

我对关系数据库相对陌生,并且在创建查询方面遇到一些问题。首先我想简单地解释一下情况。我有几个实体类。它们都扩展了 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/

相关文章:

sql - 如何制定这个 SQL 查询?

c# - 将 SqlDataSource 转换为 DataTable 和 DataView

MySQL 根据 ENUM 值进行选择

java - 嵌入多对一关系的属性

java - 如何在 jpa 监听器中获取实体管理器或事务

java - JPA 标准生成仅包含一个问题点的查询

java - 在哪里放置用于在 Facade 模式中创建 namedQuery 的代码?

java - 检查大 int 值是否为质数,Java 中的 BigInteger 问题

java - 如何使用正则表达式验证字符串 key=value 格式?

java - 使用volley库加载json数组