2015-12-04 70 views
2

我想創建一個查詢應該返回的子類型(InternalTask​​和ExternalTask​​列表)。這很好,但我想在其中一個子類型的查詢中添加一個where子句。我曾嘗試以下:QueryDSL繼承:子類型在哪裏子句

實體:

@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​​的實體。有沒有辦法完成子類型的where子句?

+0

instanceof的方法是不出來JPA的,它呢?嘗試使用BooleanBuilder.getType – MarianP

回答

1

我發現通過添加子查詢的解決方案:

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); 
}