2011-10-18 34 views
0

我想在循环中运行本机查询,查询显示正确的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表中获取数据?

+0

强行清除会话缓存你在这些表中有相同的id字段值? – axtavt

+0

如果没有在其他地方看到使用'rows',这个答案就不可能。例如,为什么'for'没有在for循环中声明? –

+0

@axtavt是所有表都有相同的id和相同的列名称,除了一列rowText,它包含不同语言的文本,具体取决于转换表。 – Rizwan

回答

2

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

Hibernate会话缓存保证在会话中只能有一个特定类型实体的特定ID的实例。由于实体通过会话高速缓存解析,即使在本机查询的情况下,您也会得到相同的实例。

所以,你有几种选择:

  • 重新考虑你的数据库玛从查询结果
  • 构造对象手动
  • 致电clear()detach()
+0

感谢您的帮助,我无法更改db schema,entityManager.clear()修复了这个问题。 – Rizwan

+0

@ user908452:请注意,clear()会从会话缓存中删除所有实体,如果这些实体中的某些实体被不同的方法加载,则可能会产生意想不到的副作用。也许最好使用'detach()'来显式移除刚加载的实体。 – axtavt

0

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

或者你可以使用一些适当的SQL做:

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

我确定rows变量不包含最后的数据,我在循环之外初始化它 - 但我试图在循环内部初始化它,但仍然无效。我遍历行ArrayList并将其添加到地图的地图。 – Rizwan