gpt4 book ai didi

java - 从表中选择所有类型的实体,但仅限于派生实体的成员

转载 作者:行者123 更新时间:2023-12-01 04:28:26 26 4
gpt4 key购买 nike

我有一个像这样的实体结构:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="CLASS_TYPE", discriminatorType= DiscriminatorType.STRING)
@DiscriminatorValue(value="SUPER")
public class SuperEntity implements Serializable {
private String anyBaseMember;
... blah blah
}

@Entity
@DiscriminatorValue(value="DERIVED")
public class DerivedEntity extends SuperEntity {
private String restrictingMember;
... getter / setter / blah blah
}

现在的中间目标是选择表的所有记录,无论类类型如何,即我必须选择所有 SuperEntity 类,但使用 where 子句:

CriteriaQuery<SuperEntity> query = criteriaBuilder.createQuery(SuperEntity.class);
Root root = query.from(SuperEntity.class);
query.where(criteriaBuilder.equal(root.get(SuperEntity_.anyBaseMember), "BLAHBLAHBLAH"));

现在,这工作得很好,可以在这个特定基本成员的限制下提供各种实体、​​SuperEntity 和 DerivedEntity。现在,有趣的地方就开始了:当且仅当当前记录属于派生类的该类型时,我必须对派生类的restrictingMember 进行进一步的限制。这是我尝试过的:

Root root = query.from(SuperEntity.class);

query.where(criteriaBuilder.and(
criteriaBuilder.equal(root.get(SuperEntity_.anyBaseMember), "BLAHBLAHBLAH"),
criteriaBuilder.or(
criteriaBuilder.notEqual(root.type(), DerivedClass.class),
criteriaBuilder.equal(((Path) root.as(DerivedClass.class)).get(DerivedClass_.restrictingMember), "SNAFU")
)
));

长话短说:它不起作用:

Exception Description: Invalid query key [restrictingMember] in expression.

它不起作用,因为似乎不可能将根转移到任何其他类。至少它不适用于 .as()

我当前完成工作的方法是仅限制父类(super class)的所有成员,然后在 for 循环中过滤掉所有其他限制。这不是最先进的,但迄今为止我唯一的想法。

编辑:找到解决方案!

Root rootBase = query.from(SuperEntity.class);
Root rootDerived = query.from(DerivedClass.class);

query.where(criteriaBuilder.and(
criteriaBuilder.equal(rootBase, rootDerived),
criteriaBuilder.equal(rootBase.get(SuperEntity_.anyBaseMember), "BLAHBLAHBLAH"),
criteriaBuilder.or(
criteriaBuilder.notEqual(rootBase.type(), DerivedClass.class),
criteriaBuilder.equal(rootDerived.get(DerivedClass_.restrictingMember), "SNAFU")
)
));

非常感谢您的想法。拉尔夫

最佳答案

我知道您可以使用“class”属性来查询命名查询上的鉴别器值,例如select e from SuperEntity e where e.class ='DERIVED'。我知道它没有使用标准,但也许它可以提供帮助。

关于java - 从表中选择所有类型的实体,但仅限于派生实体的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18230563/

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