我有一个具有以下结构的数据库表:为此,我想将该表称为MixUserTable

id, user_id, partner_id
1, 333cx1, s12z
2, 333xx1, r23z
3, r23z, t32q


我有一个不同的过程来获取包含ID列表的数组列表,其中ID列表具有user_idpartner_id的混合器。

我正在尝试遍历包含ID混合的ArrayList,并想确认ArrayList中的每个元素在数据库中是否具有对。但是要做到这一点,我必须访问多个元素才能进行数据库调用。

这是我尝试执行的方法:

我首先制作一个传递给我的ArrayList的副本:然后遍历原始的ArrayList及其副本,以检查该对是否存在:

ArrayList<UserDAO> tempPeople = new ArrayList<UserDAO>();
tempPeople = originalArrayList

for(UserDAO user : originalArrayList) {
  for (UserDAO copyUser : tempPeople) {
    if(!user.getId().equals(copyUser.getId())) {
      //select * from mixuser where user_id = 'someUvalue' and partner_id = 'otherUserValue'
      MixUserDAO mixUser = (MixUserDAO)myBatisUtil.select(myBatisUtil.MIXUSERDAO, "select", queryParams);
      if(mixUser != null) {
        Do something like update etc
      }
    }
  }
}


我的问题是这是处理此类情况的好方法,并且可以避免java.util.ConcurrentModificationException这样的异常

如果不是,那么处理这种情况的更好方法是什么?

最佳答案

ConcurrentModificationException的问题在这里:

tempPeople = originalArrayList


执行此代码时,您声明一个指向originalArrayList的指针。正确的代码应为:

tempPeople = new ArrayList(originalArrayList)


更新资料
更精确的例子:

String userIDs = "";
for(UserDAO user : originalArrayList) {
  userIDs += user.getId() + ",";
}
userIDs = userIDs.substring(0, userIDs.length-1); //remove last ','

//select * from mixuser where user_id in (list) and partner_id in (list)
MixUserDAO mixUser = (MixUserDAO)myBatisUtil.select(myBatisUtil.MIXUSERDAO, "select", userIDs);


在myBatis xml映射器中:

<select id="selectUsers" resultType="domain.blog.MixUserDAO" parameterType="java.lang.String">
  select * from mixuser
  WHERE user_id in ('#{value}') and partner_id in ('#{value}')
</select>


您将获得所有在originalArrayList中同时具有userID和parentID的用户。

10-08 11:11