在循环中运行nativeQuery不会返回正确的数据

时间:2011-10-18 19:24:41

标签: java hibernate jpa entitymanager

我试图在循环中运行本机查询,查询显示正确的sql语法,但输出始终相同。

    for (int i=0; i<translations.size(); i++) {
        Query query = entityManager.createNativeQuery("Select * from " + translations.get(i).getName(), MyModel.class);
        rows = (List<MyModel>)query.getResultList();
        // rest of the function...
    }

现在在控制台中我可以看到Hibernate语句,如:

Hibernate: Select * from translation1
Hibernate: Select * from translation2
Hibernate: Select * from translation3

但变量“rows”总是包含第一个select语句的结果,即translation1表的行。

为什么在控制台中显示它正在从其他表中进行选择,但实际上它总是从translation1表中获取数据?

2 个答案:

答案 0 :(得分:2)

如果所有表都具有相同的ID组,那么这是预期的行为。

Hibernate会话缓存保证在会话中只有一个具有特定id的特定类型实体的实例。由于实体是通过会话缓存解析的,即使是在本机查询的情况下,也可以获得相同的实例。

所以,你有几个选择:

  • 重新考虑您的数据库shema
  • 手动构建来自查询结果的对象
  • 通过调用clear()detach()
  • 强行清除会话缓存

答案 1 :(得分:0)

您确定rows变量实际上并不包含返回结果的最后一行吗?如何初始化行以及如何处理循环内的变量?如果要从所有查询中获取所有结果,则必须将每个查询(在循环内)添加到在循环开始之前声明的列表/集变量。

或者您可以使用一些正确的SQL并执行:

SELECT * FROM Table1 [JOIN/UNION] Table2 etc...