JPA-JPQL 查询以获取具有所有父实体字段的子实体字段
JPA-JPQL query to fetch child entity field with all parent entity fields
我有以下要在 JPQL
中实施的要求,但无法做到。请在这里帮助我。
我有父实体 Task
和两个子实体 MoveTask
和 PickTask
。
这些看起来像下面。
@Entity
class Task{
String taskId;
String taskName;
String taskDesc;
}
class MoveTask extends Task{
String moveType;
}
class PickTask extends Task{
String taskType;
}
现有JPQL
查询:
String Query="SELECT task.taskId,task.taskName,task.taskDesc FROM TASK";
根据我的新要求,我需要获取 PickTask
.
中的 taskType 字段
如果我如下更改查询,它不会从数据库中获取 moveTaks 记录。
String newQuery="SELECT task.taskId,task.taskName,task.taskDesc,task.taskType FROM PickTask"
我想从数据库中获取所有记录,但上面的记录只获取 PickTask
类型。
在此感谢您的帮助。
你的设计有点低效。为什么不将另一个枚举字段放入 Task 而不是再创建 2 个实体?那么你的实体将是这样的:
@Entity
class Task{
String taskId;
String taskName;
String taskDesc;
@Enumerated(EnumType.STRING)
TaskType taskType;
}
您的 JPQL 查询将非常简单:
"SELECT T FROM TASK T WHERE T.taskType = 'PICK'"
您的 JPQL 查询将非常简单:
"SELECT T FROM Task T WHERE T.taskType != null"
我设法通过在 JPQL 中使用 LEFT JOIN 解决了这个问题。
查询如下。
SELECT task.taskId,task.taskName,task.taskDesc,pickTask.taskType FROM Task task LEFT JOIN PickTask pickTask on (task.taskId=pickTask.taskId);**
谢谢@fangdi 你的想法帮助我换位思考并解决这个问题。
我有以下要在 JPQL
中实施的要求,但无法做到。请在这里帮助我。
我有父实体 Task
和两个子实体 MoveTask
和 PickTask
。
这些看起来像下面。
@Entity
class Task{
String taskId;
String taskName;
String taskDesc;
}
class MoveTask extends Task{
String moveType;
}
class PickTask extends Task{
String taskType;
}
现有JPQL
查询:
String Query="SELECT task.taskId,task.taskName,task.taskDesc FROM TASK";
根据我的新要求,我需要获取 PickTask
.
如果我如下更改查询,它不会从数据库中获取 moveTaks 记录。
String newQuery="SELECT task.taskId,task.taskName,task.taskDesc,task.taskType FROM PickTask"
我想从数据库中获取所有记录,但上面的记录只获取 PickTask
类型。
在此感谢您的帮助。
你的设计有点低效。为什么不将另一个枚举字段放入 Task 而不是再创建 2 个实体?那么你的实体将是这样的:
@Entity
class Task{
String taskId;
String taskName;
String taskDesc;
@Enumerated(EnumType.STRING)
TaskType taskType;
}
您的 JPQL 查询将非常简单:
"SELECT T FROM TASK T WHERE T.taskType = 'PICK'"
您的 JPQL 查询将非常简单:
"SELECT T FROM Task T WHERE T.taskType != null"
我设法通过在 JPQL 中使用 LEFT JOIN 解决了这个问题。
查询如下。
SELECT task.taskId,task.taskName,task.taskDesc,pickTask.taskType FROM Task task LEFT JOIN PickTask pickTask on (task.taskId=pickTask.taskId);**
谢谢@fangdi 你的想法帮助我换位思考并解决这个问题。