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

Java 在循环中运行nativeQuery不会返回正确的数据,java,hibernate,jpa,entitymanager,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.g

我尝试在循环中运行本机查询,查询显示正确的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...
    }
但变量行始终包含第一个select语句的结果,即translation1表的行


你知道为什么在控制台中它显示它也在从其他表中选择,但实际上它总是从translation1表中获取数据吗?

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

或者您可以使用一些适当的SQL并执行以下操作:

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

如果所有表都有相同的ID集,这是一种预期的行为

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

因此,您有几个选择:

重新考虑你的数据库shema 从查询结果手动构造对象 通过调用clear或detach强制清除会话缓存
这些表中的id字段值是否相同?如果不在其他地方看到行的使用情况,就不可能回答这个问题。例如,为什么不在For循环中声明行?@axtavt yes除了一列rowText之外,所有表都有相同的ID和列名,这包含不同语言的文本,具体取决于转换表。我确信rows变量不包含最后的数据,我在循环外初始化它-但我也尝试在循环内初始化它,但仍然不起作用。我迭代了行ArrayList并将其添加到映射的映射中。感谢您的帮助,我无法更改db schema,entityManager。clear修复了此问题。@user908452:请注意,clear将从会话缓存中删除所有实体,如果其中一些实体是通过不同的方法加载的,则可能会产生意外的副作用。也许使用detach只显式删除刚加载的实体会更好。
SELECT * FROM Table1 [JOIN/UNION] Table2 etc...