在循环中运行nativeQuery不会返回正确的数据
问题描述:
我想在循环中运行本机查询,查询显示正确的sql语法,但输出始终是相同的。在循环中运行nativeQuery不会返回正确的数据
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
但是变量“行”总是包含第一个SELECT语句translation1表即行的结果。
任何想法为什么在控制台中它显示它也从其他表中选择,但实际上它总是从translation1表中获取数据?
答
如果所有表都具有相同的一组ID的,这是一个预期的行为。
Hibernate会话缓存保证在会话中只能有一个特定类型实体的特定ID的实例。由于实体通过会话高速缓存解析,即使在本机查询的情况下,您也会得到相同的实例。
所以,你有几种选择:
- 重新考虑你的数据库玛从查询结果
- 构造对象手动
- 致电
clear()
或detach()
答
您确定rows变量实际上并不包含返回结果的最后一个吗?你如何初始化行,你如何处理循环中的变量?如果要从所有查询中获得所有结果,则必须将每个查询(在循环内)添加到在循环开始之前声明的列表/集变量。
或者你可以使用一些适当的SQL做:
SELECT * FROM Table1 [JOIN/UNION] Table2 etc...
+0
我确定rows变量不包含最后的数据,我在循环之外初始化它 - 但我试图在循环内部初始化它,但仍然无效。我遍历行ArrayList并将其添加到地图的地图。 – Rizwan
强行清除会话缓存你在这些表中有相同的id字段值? – axtavt
如果没有在其他地方看到使用'rows',这个答案就不可能。例如,为什么'for'没有在for循环中声明? –
@axtavt是所有表都有相同的id和相同的列名称,除了一列rowText,它包含不同语言的文本,具体取决于转换表。 – Rizwan