我有一个具有以下结构的数据库表:为此,我想将该表称为MixUserTable
id, user_id, partner_id
1, 333cx1, s12z
2, 333xx1, r23z
3, r23z, t32q
我有一个不同的过程来获取包含ID列表的数组列表,其中ID列表具有
user_id
和partner_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的用户。