【问题标题】:JPA-JPQL query to fetch child entity field with all parent entity fieldsJPA-JPQL 查询以获取具有所有父实体字段的子实体字段
【发布时间】:2017-05-23 06:41:37
【问题描述】:

我有以下要求在JPQL 中实施,但无法做到。请在这里帮助我。

我有父实体 Task 和两个子实体 MoveTaskPickTask

如下所示。

@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"

我想从 db 中获取所有记录,但上述记录仅获取 PickTask 类型。

在这里感谢您的帮助。

【问题讨论】:

标签: jpa jpql


【解决方案1】:

你的设计有点低效。为什么不将另一个枚举字段放入 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'"

【讨论】:

  • 抱歉,我无法更改标准实体任务。我只能对 MoveTask 实体进行更改。
  • 如果是这种情况,您可以尝试使用 JOIN 查询。但是我不推荐这样的设计,以后扩展和测试非常困难。
【解决方案2】:

您的 JPQL 查询将非常简单:

  "SELECT T FROM Task T WHERE T.taskType != null"

【讨论】:

  • 我收到一个错误,因为任务实体中没有定义变量 taskType。
  • 错误是状态字段路径'task.taskType'无法解析为有效类型
  • Jpql 中区分大小写的错误。你的实体没有持久化到任何数据库?
  • 嗨,你如何测试你的 jpql 查询?
【解决方案3】:

我设法通过在 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,你的想法帮助我换种方式思考并解决这个问题。

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 2012-02-05
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多