JPA是否在JPQL中加载实体,就像在代码中使用实体时一样?

时间:2016-02-22 13:30:55

标签: java jpa

我有两个表:PersonHouse,映射是一对一的。

现在我必须将address PersonHouse(可能不同)分配到同一地址。

有超过5000条记录。哪个会更快?使用代码逐个更新实体,例如

for (id : Ids) {
    Person person = PersonDAO.find(id);
    person.setAddress ("abc");
}

然后对House;

执行相同操作

或者我应该使用JPQL来更新两个不同的查询,例如

UPDATE Person p SET p.Address = "abc" WHERE ID IN(.....ID QUERY)

我的问题是什么会更快?使用JPQL的更新是否具有相同的性能,与代码中的相同?或者我应该使用本机查询来加载实体,因为我只想要性能。

2 个答案:

答案 0 :(得分:0)

使用查询会更快(并且内存效率更高),因为查询提供程序会将JPQL查询转换为本机SQL。此外,如果直接使用实体,则对数据库进行的查询数量将显着增加(每行选择一次并更新)。

答案 1 :(得分:0)

原生查询会更快,因为它不需要翻译任何内容。

如果您希望它更快,可以使用PreparedStatement。使用.addBatch()方法将查询添加到批处理中,使用executeBatch()方法,您将执行完整批处理,从而最大限度地减少在用户和内核模式之间切换的次数。