Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA Criteria API-查询代码在单独执行时有效,但在用作子查询时无效_Java_Hibernate_Jpa_Criteria Api - Fatal编程技术网

Java JPA Criteria API-查询代码在单独执行时有效,但在用作子查询时无效

Java JPA Criteria API-查询代码在单独执行时有效,但在用作子查询时无效,java,hibernate,jpa,criteria-api,Java,Hibernate,Jpa,Criteria Api,我有一个名为Issue的实体和一个名为UserIssue的实体用户问题扩展问题 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Where(clause = "DELETED_AT IS NULL") @Entity(name = "ISSUE") public class Issue extends VersionedSequenceIdEntity { ... all fields } @

我有一个名为
Issue
的实体和一个名为
UserIssue
的实体<代码>用户问题扩展
问题

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Where(clause = "DELETED_AT IS NULL")
@Entity(name = "ISSUE")
public class Issue extends VersionedSequenceIdEntity {
... all fields
}

@Where(clause = "DELETED_AT IS NULL")
@Entity(name = "USER_ISSUE")
public class UserIssue extends Issue {

    ...

    @Column(name = "IS_PRIVATE", nullable = false)
    private Boolean isPrivate;

    ...
}
我正在做一个子查询,以按sublcass属性进行过滤。我的确切测试用例是我创建了三个用户问题。其中两个在false上具有“isPrivate”属性。第三个是真的

当我执行这个实际上只是子查询的代码时,结果包含两个基于条件的“问题”,它是正确的

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<UserIssue> issueQuerySimple = cb.createQuery(UserIssue.class);
Root<UserIssue> issueRootSimple = issueQuerySimple.from(UserIssue.class);

issueQuerySimple.select(issueRootSimple).where(cb.isFalse(issueRootSimple.get("isPrivate")));
List<UserIssue> resultListSimple = entityManager.createQuery(issueQuerySimple).getResultList();
那么,为什么基于子类字段的过滤不起作用,它会返回所有三个实例,而不是两个?有什么不对劲还是我看不见


非常感谢

替换

issueQuery.select(issueRoot).where(cb.exists(subQuery))

issueQuery.select(issueRoot).where(issueRoot.get(“id”).in(子查询))

解释

  • 从sql查询中我们可以看到,只要存在一个one
    userissue
    with
    is_private=0
    ,它就会选择所有
    问题
  • 这不是你想要的行为。您仍然必须使用子查询,但要在
中用
issue0.id替换
exists
,而此代码段就是这样做的
您能否将
问题
表格中的数据添加到问题中?
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);

subQuery.select(userIssueRoot).where(cb.isFalse(userIssueRoot.get("isPrivate")));

issueQuery.select(issueRoot).where(cb.exists(subQuery));
List<Issue> resultList = entityManager.createQuery(issueQuery).getResultList();
select
        issue0_.id as id2_2_,
        issue0_.deleted_at as deleted_3_2_,
        issue0_.created_when as created_4_2_,
        issue0_.created_by as created_5_2_,
        issue0_.updated_when as updated_6_2_,
        issue0_.version as version7_2_,
        issue0_.application_id as applicat8_2_,
        issue0_.version_id as version_9_2_,
        issue0_.organization_id as organiz10_2_,
        issue0_.severity as severit11_2_,
        issue0_.state as state12_2_,
        issue0_.title as title13_2_,
        issue0_.type_id as type_id18_2_,
        issue0_.updated_by_customer_at as updated14_2_,
        issue0_.assigned_to as assigne15_2_,
        issue0_.description as descrip16_2_,
        issue0_.is_private as is_priv17_2_,
        issue0_.dtype as dtype1_2_ 
    from
        issue issue0_ 
    where
        (
            issue0_.DELETED_AT IS NULL
        ) 
        and (
            exists (
                select
                    userissue1_.id 
                from
                    issue userissue1_ 
                where
                    userissue1_.dtype='UserIssue' 
                    and (
                        userissue1_.DELETED_AT IS NULL
                    ) 
                    and userissue1_.is_private=0
            )
        )