Java QueryDSL继承:where子句中的子类型

Java QueryDSL继承:where子句中的子类型,java,openjpa,querydsl,Java,Openjpa,Querydsl,我正在尝试创建一个查询,它应该返回子类型(InternalTask和ExternalTask的列表)。这非常有效,但我想在查询中为其中一个子类型添加where子句。我尝试了以下方法: 实体: @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "TASK_TYPE") public abstract class Task { ... } @Entity @Di

我正在尝试创建一个查询,它应该返回子类型(InternalTask和ExternalTask的列表)。这非常有效,但我想在查询中为其中一个子类型添加where子句。我尝试了以下方法:

实体:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TASK_TYPE")
public abstract class Task {
    ...
}

@Entity
@DiscriminatorValue("INTERNAL")
public class InternalTask extends Task {
    ...
    private Employee employee;
    ...
}

@Entity
@DiscriminatorValue("EXTERNAL")
public class ExternalTask extends Task {
    ...
}
功能:

public List<? extends Task> findTasks(TaskSearch taskSearch) {
    JPAQuery query = new JPAQuery(entityManager);

    QTask task = QTask.task;
    BooleanBuilder where = new BooleanBuilder();

    if (taskSearch.getEmployee() != null) {
        where.and(task.instanceOf(InternalTask.class).and(task.as(QInternalTask.class).employee.eq(taskSearch.getEmployee())));
    }

    query.from(task).where(where).orderBy(task.deadline.asc());

    return query.list(task);
}

正如您所看到的,它被转换为任务实体上的select,该实体不知道子类型InternalTask。有没有办法在子类型上实现where子句?

我通过添加子查询找到了解决方案:

public List<? extends Task> findTasks(TaskSearch taskSearch) {
    JPAQuery query = new JPAQuery(entityManager);

    QTask task = QTask.task;
    QInternalTask internalTask = QInternalTask.internaltask;
    BooleanBuilder where = new BooleanBuilder();

    if (taskSearch.getEmployee() != null) {
        JPASubQuery from = new JPASubQuery().from(internalTask)
                .where(internalTask.employee.eq(taskSearch.getEmployee()).and(internalTask.id.eq(task.id)));
        where.and(from.exists());
    }

    query.from(task).where(where).orderBy(task.deadline.asc());

    return query.list(task);
}

public list instanceOf方法不是出自JPA,是吗?尝试BooleanBuilder.getType
public List<? extends Task> findTasks(TaskSearch taskSearch) {
    JPAQuery query = new JPAQuery(entityManager);

    QTask task = QTask.task;
    QInternalTask internalTask = QInternalTask.internaltask;
    BooleanBuilder where = new BooleanBuilder();

    if (taskSearch.getEmployee() != null) {
        JPASubQuery from = new JPASubQuery().from(internalTask)
                .where(internalTask.employee.eq(taskSearch.getEmployee()).and(internalTask.id.eq(task.id)));
        where.and(from.exists());
    }

    query.from(task).where(where).orderBy(task.deadline.asc());

    return query.list(task);
}