我有一个像这样的更新查询
Update Table name set valstring = ? where valstring = ? and ID in (?)
所以JPA交易是
em.CreateNativeQuery(Update_QUERY).setParameter(1, updatedStatus).setParameter(2,currentStatus).setParameter(3,ids).executeUpdate();
方法的输入是List id,currentStatus和updatedStatus
如何将List作为单个参数传递,如果我将List转换为逗号分隔的String我得到错误指定的文本不是数字,因为In子句中不允许使用字符串
答案 0 :(得分:6)
如何将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();
三个简单的规则:
使用本机SQL对非映射到实体的表进行批量更新/删除。
本机SQL查询直接在绕过持久性上下文(一组托管实体)的数据库表上工作,因此如果给定的数据库表没有相应的实体,则可以安全地使用此类查询。
使用JPQL对映射到实体的表进行批量更新/删除
如果给定的数据库表由实体映射,则使用SQL更新/删除将导致持久性上下文与底层数据库之间的不一致,因此使用JQPL对应项而持久性提供程序将处理一致性。 / p>
批量更新/删除应作为交易中的第一个操作执行,或理想情况下在其自己的交易中执行。
答案 1 :(得分:0)
JPA Query
接口setParameter
方法接受一个Object
参数:
Query setParameter(String name, Object value)
可以将List
作为参数值。
这对于JPQL,Criteria API或批量更新和删除查询的工作方式相同:
List<Post> posts = entityManager.createNativeQuery("""
UPDATE
post
SET
status = :newStatus
WHERE
status = :oldStatus AND
id IN :ids
""", Post.class)
.setParameter("oldStatus", PostStatus.PENDING)
.setParameter("newStatus", PostStatus.APPROVED)
.setParameter("ids", List.of(1L, 2L, 3L))
.executeUpdate();
有关使用JPA和Hibernate执行批量更新和删除语句的更多详细信息,请同时查看this article。