【问题标题】:Query only returns entities if their child isnt null查询仅在其子项不为空时返回实体
【发布时间】:2019-12-17 13:09:00
【问题描述】:

我有以下疑问:

  @Query("SELECT new de.hiqs.project.Project(project.id, project.name, project.isArchived, " +
          "project.customer.id, project.customer.name, project.customer.smallestTimeUnitEnabled, " +
          "project.customer.smallestTimeUnit, project.defaultDailyEntrySettings.id, " +
          "project.defaultDailyEntrySettings.performanceRecord, project.defaultDailyEntrySettings.startDateHour," +
          "project.defaultDailyEntrySettings.startDateMinute, project.defaultDailyEntrySettings.endDateHour, " +
          "project.defaultDailyEntrySettings.endDateMinute, project.defaultDailyEntrySettings.pause ) " +
          "FROM Project project")
  List<Project> findAllInOneRequest();

所以我有一个查询,它返回具有所选属性的所有项目,以便在一个请求中获取所有内容并避免 N+1 问题。如您所见,ProjectDefaultDailyEntrySettings 有关系(外键)。问题是并非每个项目都有DefaultDailyEntrySettings 子项(数据库中为空)。所以查询只返回有一个的projects。我希望它返回所有projects,如果defaultDailyEntrySettings不存在,则使用null初始化,而不是在没有defaultdailyEntrySettings的情况下不返回projects。有办法吗?

另一种选择是自动给每个project 一个带有空字段的defaultDailyEntrySettings,而不是外键为空,但我不知道如何使用注释来做到这一点。

【问题讨论】:

    标签: java sql hql


    【解决方案1】:

    也许是这样的?

    @Query("SELECT new de.hiqs.project.Project(project.id, project.name, project.isArchived, " +
          "project.customer.id, project.customer.name, project.customer.smallestTimeUnitEnabled, " +
          "project.customer.smallestTimeUnit, project.defaultDailyEntrySettings.id, " +
          "project.defaultDailyEntrySettings.performanceRecord, project.defaultDailyEntrySettings.startDateHour," +
          "project.defaultDailyEntrySettings.startDateMinute, project.defaultDailyEntrySettings.endDateHour, " +
          "project.defaultDailyEntrySettings.endDateMinute, project.defaultDailyEntrySettings.pause ) " +
          "FROM Project project " +
          "WHERE EXISTS (SELECT 1 FROM project.defaultDailyEntrySettings)" +
          "UNION ALL " + 
          "SELECT new de.hiqs.project.Project(project.id, project.name, project.isArchived, " +
          "project.customer.id, project.customer.name, project.customer.smallestTimeUnitEnabled, " +
          "project.customer.smallestTimeUnit, null, " +
          "null, null," +
          "null, null, " +
          "null, null ) " +
          "FROM Project project " +
          "WHERE NOT EXISTS (SELECT 1 FROM project.defaultDailyEntrySettings)")
    List<Project> findAllInOneRequest();
    

    【讨论】:

    • 这只是做同样的事情查询已经在做。它只返回带有 defaultDailyEntrySettings 的项目。但我希望它返回 所有 项目。行为应该是a)如果项目有defaultDailyEntrySettings,那么它应该返回带有defaultDailyEntrySetting的项目(就像它已经做的那样)和b)如果项目没有defaultDailyEntrySettings,则返回项目并忽略或使用null为defaultDailyEntrySettings。属于情况 b) 的项目目前只是被忽略并且根本不返回。
    • 我不允许这样使用 null,总是得到一个空指针。 UNION 在我使用的版本中也不存在。我想我能想到的唯一解决方案是将它分成两个查询。一种使用 defaultDailyEntrySettings 获取所有项目。另一种是在没有 defaultDailyEntrySettings 的情况下获取项目。之后我可以结合这两个结果。
    • 我同意两个查询。不能 100% 确定 JPQL,但这是 SQL 开发中此类事情的常见方式。
    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2016-10-12
    • 2012-02-19
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多