如何使用一个查询进行更新?我想做这样的事情:
update customer
set balance = (400,150) where customer_id IN ('2','3');
客户2将获得400的新余额,而客户3将获得150。
我想要一个查询,因为我使用的是spring-boot,JPA-
@Modifying
@Query("update customer set balance = (400,150) where customer_id IN ('2','3');")
我可以在这里做两个查询吗?每个客户?推荐什么?什么是可以接受的?
谢谢。
你可以通过这种方式-
Update customer
SET balance = (case when customer_id = '2' then '400'
when customer_id = '3' then '150'
end)
WHERE
customer_id IN ('2','3');
CASE语句可能就是您想要的。
UPDATE customer
SET balance = (case
when customer_id = 1 then 150
when customer_id = 2 then 300
end)
WHERE ID in (1,2);
如果customer_id的类型为字符串,请在customer_id编号中添加引号。
我的例子只是的一个修改版本
Example Code:
UPDATE students
SET JavaScore = (case
when ID = 1 then 75
when ID = 2 then 80
when ID = 3 then 86
when ID = 4 then 55
end),
PythonScore = (case
when ID = 1 then 70
when ID = 2 then 85
when ID = 3 then 94
when ID = 4 then 75
end)
WHERE ID in (1,2,3,4);
来自本网站:
DelftStack
Hibernate可以为您做到这一点,而无需编写自己的查询。
步骤。
- 将
hibernate.jdbc.batch_size
设置为某个合理的大小 - 启用插入/更新查询排序
- 为MySQL启用语句重写(将
rewriteBatchedStatements
设置为true
(
在application.properties中添加以下
spring.jpa.properties.hibernate.jdbc.batch_size=50
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
# spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true # Needed when using versioned data
spring.datasource.hikari.dataSourcePoperties.rewriteBatchedStatements=true
另请参阅此和此了解更多背景信息。
现在,在您的代码中,您只需更新和保存客户,数据库将只收到1个查询。
如果您想使用spring数据方式,您必须尽可能少地使用复杂的SQL/JQL。
@Entity
class CustomerEntity {
}
@Modifying
@Query("update CustomerEntity customer set customer.balance = :balance where customer.id = :customerId")
int updateCustomerBalance(@Param("customerId") String customerId, @Param("balance") String balance);
customerRepository.updateCustomerBalance("2", "400");
customerRepository.updateCustomerBalance("3", "150");
常见交易
如果你想更新发生在一个交易
@Transactional
void doUpdate() {
customerRepository.updateCustomerBalance("2", "400");
customerRepository.updateCustomerBalance("3", "150");
}
请记住,您必须从外部呼叫service.doUpdate()
。如果从另一个服务方法调用该方法,则不会创建事务。
检查是否发生了更新
int count = customerRepository.updateCustomerBalance("2", "400");
if (count == 0) {
log.error("Customer not updated customerId=2 customerBalance=400");
}