徐州北大青鸟
当前位置: 主页 > 学在青鸟 > 编程技巧 >

如何对多重唯一键入库前检查

时间:2011-04-13 10:22来源:中博IT教育 作者:代码如诗 点击:
在我们实际操作数据库时,有时在一个表中有多个唯一键,比如会员号及身份证号及其他标识,为了防止出现入库错误,在存入数据库之前就要对数据进行多重唯一键检查

在我们实际操作数据库时,有时在一个表中有多个唯一键,比如会员号及身份证号及其他标识,为了防止出现入库错误,在存入数据库之前就要对数据
进行多重唯一键检查,查看是否有重复数据,参考代码如下:

/**
 * 检查数据表中是否存在相同值的数据
 * @param <T>
 * @param em        EntityManager
 * @param entity    Entity 类
 * @param id        需要查询的主键,新增时输入 null
 * @param fields    需要检查的字段名称
 * @param values    需要检查的字段的值
 * @return
 *     有重复数据时返回 true; 没有重复数据时返回 false
 *
 * @代码如诗 2010-2-20 下午02:12:34
 */
@SuppressWarnings("unchecked")
public static <T> boolean hasExistData(EntityManager em, Class<T> entity,
        Object id, String[] fields, Object[] values) {
    if(em == null || entity == null) {
        throw new IllegalArgumentException("EntityManager 与 Entity Class 两个参数为空");
    }
    if(fields == null || values == null || fields.length == 0 || values.length == 0) {
        throw new IllegalArgumentException("字段数量或值数量不能为空");
    }
    if(fields.length != values.length) {
        throw new IllegalArgumentException("字段数量与值数量不一致");
    }
    StringBuffer buff = new StringBuffer();
    buff.append("SELECT t FROM ").append(entity.getSimpleName()).append(" t WHERE t.id <> :id ");
    for(int i = 0; i < fields.length; i++) {
        buff.append(" AND t.").append(fields[i]).append(" = :").append(fields[i]);
    }
    // System.out.println(buff.toString());
    Query q = em.createQuery(buff.toString());
    if(id != null) {
        q.setParameter("id", id);
    } else {
        q.setParameter("id", 0);
    }
    for(int i = 0; i < fields.length; i++) {
        q.setParameter(fields[i], values[i]);
    }
    List<T> list = q.getResultList();
    if(list == null || list.size() == 0) {
        return false;
    }
    return true;
}

(责任编辑:代码如诗)
------分隔线----------------------------
栏目列表
推荐内容