【问题标题】:JPA Criteria API - where condition with field on subclassJPA Criteria API - where 条件与子类上的字段
【发布时间】:2020-07-02 11:21:01
【问题描述】:

我有一个名为Issue 的实体和一个名为UserIssue 的实体。 UserIssue 扩展了 Issue

@Inheritance(strategy = InheritanceType.JOINED)
@Entity(name = "ISSUE")
public class Issue extends VersionedSequenceIdEntity {
... all fields
}

@Entity(name = "USER_ISSUE")
public class UserIssue extends Issue {

    ...

    @Enumerated(EnumType.STRING)
    @Column(name = "CATEGORY", nullable = false)
    private IssueCategory category;

    ...
}

我需要做例如像这样:

Predicate predicate= root.get("category").in(IssueCategory.CATEGORY_1, IssueCategory.CATEGORY_2);

问题是 root 是 Root<Issue> 的实例,但“类别”字段是在子类 UserIssue 上定义的,所以这行代码显然不起作用。

有没有办法构建一个谓词来为子类字段创建 where 条件?我只有Root<Issue>, CriteriaQuery and CriteriaBuilder 的实例。

谢谢你, 卢卡斯

【问题讨论】:

  • 在帖子中添加您的实体

标签: java jpa criteria-api


【解决方案1】:
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Issue> issueQuery = cb.createQuery(Issue.class);
    Root<Issue> issueRoot = issueQuery.from(Issue.class);

    Subquery<UserIssue> subQuery = issueQuery.subquery(UserIssue.class);
    Root<UserIssue> userIssueRoot = subQuery.from(UserIssue.class);

    Predicate predicate= userIssueRoot.get("category")
          .in(IssueCategory.CATEGORY_1, IssueCategory.CATEGORY_2);
    subQuery.select(userIssueRoot).where(predicate);

    issueQuery.select(issueRoot).where(issueRoot.get("id").in(subQuery));
    em.createQuery(issueQuery).getResultList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多