java - QueryDSL 继承 : subtype in where clause

标签 java openjpa querydsl

我正在尝试创建一个应该返回子类型(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);
}

错误:

An error occurred while parsing the query filter "select task_
from Task task_
where (type(task_) = ?1 and task_.employee = ?2)
order by task_.deadline asc". Error message: No field named "employee" in "Task". Did you mean "deadline"? Expected one of the available field names in "com.exampe.Task": "[deadline]".

如您所见,它被转换为不知道子类型 InternalTask​​ 的 Task 实体上的选择。有没有办法在子类型上完成 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);
}

关于java - QueryDSL 继承 : subtype in where clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34097149/

相关文章:

java - OpenJpa 合并分离对象

java - 使用 TomEE 并打开 JPA,我收到以下错误 : SEVERE: JAVA AGENT NOT INSTALLED

gradle - 具有QueryDSL和Gradle的IntelliJ 15

java - 为什么 OpenJPA 默认不存储外键?

mysql - QueryDSL 和 Hibernate 未声明路径 'provider'/SQL 语法错误

playframework - QueryDSL 和 Play 框架

java - 广播接收器和内存泄漏

Java:将纬度/经度从 EPSG:4236 转换为 EPSG: 3857

java - 如何在owl类和java类之间进行高效快速的映射?

java - JPA 惰性设计建议