我试图在循环中运行本机查询,查询显示正确的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表中获取数据?
答案 0 :(得分:2)
如果所有表都具有相同的ID组,那么这是预期的行为。
Hibernate会话缓存保证在会话中只有一个具有特定id的特定类型实体的实例。由于实体是通过会话缓存解析的,即使是在本机查询的情况下,也可以获得相同的实例。
所以,你有几个选择:
clear()
或detach()
答案 1 :(得分:0)
您确定rows变量实际上并不包含返回结果的最后一行吗?如何初始化行以及如何处理循环内的变量?如果要从所有查询中获取所有结果,则必须将每个查询(在循环内)添加到在循环开始之前声明的列表/集变量。
或者您可以使用一些正确的SQL并执行:
SELECT * FROM Table1 [JOIN/UNION] Table2 etc...