我有一个像这样的更新查询
Update Table name set valstring = ? where valstring = ? and ID in (?)
Run Code Online (Sandbox Code Playgroud)
所以JPA交易是
em.CreateNativeQuery(Update_QUERY).setParameter(1, updatedStatus).setParameter(2,currentStatus).setParameter(3,ids).executeUpdate();
Run Code Online (Sandbox Code Playgroud)
方法的输入是List id,currentStatus和updatedStatus
如何将List作为单个参数传递,如果我将List转换为逗号分隔的String我得到错误指定的文本不是数字,因为In子句中不允许使用字符串
如何将List作为单个参数传递
一个示例方法:
String jpql = "UPDATE NameEntity ne " +
"SET ne.valstring = :updated_status " +
"WHERE ne.valstring = :current_status AND ne.id IN :ids";
em.createQuery(jqpl)
.setParameter("updated_status", updatedStatus)
.setParameter("current_status", currentstatus)
.setParameter("ids", Arrays.asList(ids))
.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
三个简单的规则:
使用本机SQL对未映射到实体的表进行批量更新/删除.
本机SQL查询可以绕过持久性上下文(一组托管实体)直接在数据库表上工作,因此如果给定的数据库表没有相应的实体,则可以安全地使用此类查询.
使用JPQL对映射到实体的表进行批量更新/删除
如果给定的数据库表由实体映射,则使用SQL更新/删除将导致持久性上下文与底层数据库之间的不一致,因此使用JQPL对应项而持久性提供程序将处理一致性.
批量更新/删除应作为事务中的第一个操作执行,或者理想情况下在其自己的事务中执行.