【问题标题】:what does occur within my JPA Native Query?我的 JPA 原生查询中会发生什么?
【发布时间】:2012-11-26 08:43:57
【问题描述】:

我在 mysql 上使用这个查询(tbl1 中的每条记录都有 tbl2 中的记录列表):

select tbl1.id, tbl2.id from parenttable1 tbl1 join childtable2 tbl2 on tbl1.id = tbl2.tbl1Id

结果是真的,但是当我在我的应用程序中将其用作本机查询 (javax.persistence.EntityManager#createNativeQuery()) 时,会重复 tbl2.id。有什么问题?

结果是这样的:

id   id
11   1
11   1
22   3
33   4
44   5
44   5
44   5

但我希望:

id   id
11   1
11   2
22   3
33   4
44   5
44   6
44   7

我的代码是这样的:

List<MyDTO> foundList = (List<MyDTO>) entityManager.createNativeQuery("the query above", MyDTO.class).getResultList();

【问题讨论】:

  • 原生查询是什么意思?
  • 我的意思是 javax.persistence.EntityManager#createNativeQuery()
  • 这样的查询结果怎么会是true?向我们展示您的代码、您的数据、您期望的结果以及您获得的实际结果。
  • 这有什么问题?!结果是表 1 记录的 ID 和表 2 记录的 ID(结果数是表 2 中的记录数,例如,如果表 1 中有 5 个父记录,表 2 中有 10 个子记录,则结果将包含 10记录,因此 tbl1.id 可以重复,但 tbl2.id 应该是唯一的)
  • 如果查询返回,这可能意味着您实际上在子表中有重复的记录,或者您忽略向我们展示的代码做了一些奇怪的事情。确保 child_table.id 上存在唯一或 PK 约束。您可以简单地将 distinct 关键字添加到查询中,但这会隐藏问题而不是解决问题。

标签: sql jpa join entitymanager nativequery


【解决方案1】:

如果您不知道应该如何映射这两列,我看不出 JPA 如何将返回具有相同名称的两列的查询结果映射到 DTO。而且你甚至没有展示 DTO 的样子。

执行下面的代码,应该一切正常:

List<Object[]> list = (List<Object[]>) em.createNativeQuery(sql).getResultList();
List<MyDTO> result = new ArrayList<MyDTO>(list.size());
for (Object[] row : list) {
    result.add(new MyDTO((Long) row[0], (Long) row[1]));
}

下次当你被要求展示你的代码时,去做而不是认为它是完美的或显而易见的,并且错误一定来自其他地方。 99.999% 的情况下,错误在您的代码中,而不是在数百万开发人员使用和测试的库的代码中。

【讨论】:

    【解决方案2】:

    非常感谢您的启发。问题是 @Id 存在于父表的 id 字段而不是子表的 id 字段(在 DTO 内)!

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2012-04-03
      • 1970-01-01
      • 2011-10-16
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多