【发布时间】:2015-05-19 23:43:43
【问题描述】:
我正在尝试 JPA 2.1 (eclipselink) 中的“TREAT AS”功能,但遇到了来自 JPA 的错误:
异常描述:ReportQuery 结果大小不匹配。期待 [263],但检索到 [197]
这是我的 JPQL 查询(我将某些部分更改为更明确):
String jpql = "select distinct s, accountAD "
+ "from SheetAccountUser s "
+ "left join fetch s.userTarget target "
+ "left join TREAT(target.accounts AS ADAccount) accountAD ";
ADAccount 是 AbstractAccount (@Inheritance(strategy = InheritanceType.JOINED) 的子类。 用户有一个 AbstractAccount 列表。
我想选择带有 userTarget 的 AD 帐户的工作表。如果没有 userTarget 或 userTarget 没有 AD 帐户(左连接),我希望为 null。
问题来自处理运算符。 SQL 生成的查询在 AbstractAccount 表和 ADAccount 表之间有一个左连接。 这会导致每个目标用户的帐户类型检索一行。
这是生成的 SQL 查询:
SELECT DISTINCT
t0.Id, --etc
t6.Id, t6.name, --etc
t7.userId --etc
FROM sheet t0
LEFT OUTER JOIN user t6 ON (t6.Id = t0.userTargetId),
account t7 LEFT OUTER JOIN ad_account t8 ON ((t8.userId = t7.userId) AND (t8.idApp = t7.idApp))
WHERE (t7.userId = t6.Id) AND (t7.DTYPE = 'ADAccount');
我们可以看到 account 和 ad_account 之间的左外连接。 此外,在 select 子句中不存在 ad_account 表。 (idApp 字段是主键的一部分,维护唯一的(userId,idApp)约束)。 不知道是我的理解有问题还是JPA有问题。
谢谢你帮助我!
【问题讨论】:
-
尝试简化查询,然后发布 SQL(不需要所有连接来证明您的问题)。 Treat 应该是强制子类表之间的连接和/或过滤类型字段,所以我不太清楚你的期望。
-
当然,我添加了sql查询并简化了jpql。
-
刚刚意识到您可能期望使用左连接返回空值,而您的 SQL 在 t7 和 t6 之间有一个内部连接(我假设的目标和帐户)。
标签: java jakarta-ee jpa jpql