我对关系数据库相对陌生,并且在创建查询方面遇到一些问题。首先我想简单地解释一下情况。我有几个实体类。全部都延伸了AbstractEntity
or 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实体”,在这里我也不知道如何以仅返回特定类型的方式编写它......
感谢您提前的答复!
编辑:将第二个问题移至标准查询:结果列表不明确并删除了代码中的不同(这不起作用)
我知道这是一个老问题,但以防万一有人偶然发现同样的问题,这里是解决方法。
您可以轻松地按实体类型进行过滤,如下所示:
Predicate p = cb.equal(entity.type(), cb.literal(ConcreteEntity.class));
where entity可以是路径(包括根和连接),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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)