在java中使用StringBuilder hql = new StringBuilder();写一条sql,数据库表为smsserver_out,表有两个字段status和user_id,如果字段status的字段为U或者Q并且user_id等于前端传过来的affairId,注意affairId可能是一个也有可能十多个,就把status的状态修改为Z,使用预编译的方式,要注意user_id为空的情况
时间: 2024-02-24 15:55:43 浏览: 62
stringbuilder用法 java中StringBuilder的⽤法
好的,以下是符合您要求的Java代码:
```java
StringBuilder hql = new StringBuilder();
Map<String, Object> param = new HashMap<String, Object>();
hql.append("UPDATE smsserver_out SET status = 'Z' WHERE status IN ('U', 'Q')");
if (affairId != null && affairId.length > 0) {
hql.append(" AND user_id IN (");
for (int i = 0; i < affairId.length; i++) {
hql.append(":affairId").append(i);
param.put("affairId" + i, affairId[i]);
if (i < affairId.length - 1) {
hql.append(", ");
}
}
hql.append(")");
} else {
hql.append(" AND user_id IS NULL");
}
try (Session session = sessionFactory.openSession()) {
Transaction tx = session.beginTransaction();
Query query = session.createQuery(hql.toString());
for (Map.Entry<String, Object> entry : param.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
query.executeUpdate();
tx.commit();
}
```
其中,`affairId`为前端传过来的用户ID数组,如果为`null`或长度为0则表示查询所有用户。PreparedStatement是预编译的方式,可以有效防止SQL注入攻击。此外,代码中使用了`IN`关键字来查询多个用户ID,避免了多次查询的情况。
阅读全文