声纳问题:正确性 - 调用 equals() 比较不同类型

Sonar Issue: Correctness - Call to equals() comparing different types

不知道你在比较两个字符串或者构建一个Stringbuilder的时候有没有遇到过这种问题

Correctness - Call to equals() comparing different types findbugs : EC_UNRELATED_TYPES This method calls equals(Object) on two references of different class types with no common subclasses. Therefore, the objects being compared are unlikely to be members of the same class at runtime (unless some application classes were not analyzed, or dynamic class loading can occur at runtime). According to the contract of equals(), objects of different classes should always compare as unequal; therefore, according to the contract defined by java.lang.Object.equals(Object), the result of this comparison will always be false at runtime.

@SuppressWarnings("unchecked")
public List<MaterialUsuarioEO>buscar(FiltroMaterialUsuarioDto filtro){
    String vacio="";
    StringBuilder sb = new StringBuilder("Select mu from MaterialUsuarioEO mu where 1=1");

    if (filtro.getMaterial() != null && !vacio.equals(filtro.getMaterial().getId())) {
        sb.append("and upper(mu.material.id) like :id ");
    }
    if (filtro.getUsuario() != null && !vacio.equals(filtro.getUsuario().getNombre())) {
        sb.append("and upper(mu.usuario.nombre) like :nombre ");
    }

    Query q = em.createQuery(sb.toString());

    if (filtro.getMaterial() != null && !"".equals(filtro.getMaterial().getId())) {
        q.setParameter("id", "%" + filtro.getMaterial().getId().toUpperCase() + "%");
    }
    if (filtro.getUsuario() != null && !"".equals(filtro.getUsuario().getNombre())) {
        q.setParameter("nombre", "%" + filtro.getUsuario().getNombre().toUpperCase() + "%");
    }

    return q.getResultList();

}

顺便说一句,我使用 SonarQube 工具得到了这个。不,我确定它正在比较两个字符串,所以我仍然没有任何线索,不仅我无法确定我失败的地方而且我也不知道问题是什么试图告诉我.

在此期间我会继续寻找,如果我找到它我会post它,仍然会感谢您的更多方法,谢谢。

这些属性是什么类型?

filtro.getUsuario().getNombre() filtro.getMaterial().getId()

如果它们不是 String 类型,则不应通过等号来比较它们。 但您可以执行以下操作:

Integer.valueOf(vacio).equals(filtro.getUsuario().getNombre())

因此 vacio 的字符串值被转换为一个整数,因此可以通过 equals 与另一个整数 (getNombre()) 进行检查。