java si long no funciona

Situación realmente extraña que llegué aquí. Tengo 2 clases.

  
@Entity
public class CategoryData extends EntityData {
    public Long parentId;

    @Column(unique=true)
    public String name;
    public Picture picture;
}
  
@Entity
public class PropertyGroupData extends EntityData {
    public Long categoryId;
    public String adminDescription;
    public String title;
    @ManyToMany(fetch=FetchType.EAGER)
    public List properties = new LinkedList();

}

esta es la clase de entidad para mi hibernación.

 
@MappedSuperclass
public class EntityData implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;
    @Temporal(TemporalType.TIMESTAMP)
    public Date created = new Date();
    @Temporal(TemporalType.TIMESTAMP)
    public Date modified = new Date();

    public Long version =  0L;
    // W:waiting,A:active,D:deleted
    public Character status;

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
        //return "EntityData[id=" + id + "]";
    }
}

aquí viene la situación. Tengo algunos datos en mi base de datos y funciona bien. hasta ahora.


for(CategoryData c:kategoriler)
    if(pgd.categoryId.toString().equals(c.id.toString()))
        out.print("1-find equal "+c.id);
for(CategoryData c:kategoriler)
    if(pgd.categoryId==c.id)
        out.print("2-find equal "+c.id);

el primer ciclo for funciona normalmente e imprime 1-find igual a 7 pero el segundo ciclo no imprime nada. ambos Long. Qué estoy haciendo mal ?

preguntado el 08 de enero de 11 a las 17:01

3 Respuestas

Las expresiones son de tipo Long, que es una clase y, por lo tanto, se comparan por identidad de referencia. Si fueran long, estaría bien. Prueba esto en su lugar:

for(CategoryData c:kategoriler)
    if(pgd.categoryId.longValue() == c.id.longValue())
        out.print("2-find equal "+c.id);

Respondido el 08 de enero de 11 a las 20:01

Esos valores primitivos frente a objetos están causando muchos más problemas de los que deberían. - Rekin

Estás comparando 2 objetos por referencia. Es decir, está comprobando si son referencias al mismo objeto. Lo que quieres es comprobar si tienen los mismos valores, p. Ej.

if(pgd.categoryId.longValue() == c.id.longValue())

Respondido el 08 de enero de 11 a las 20:01

Dado que Long anula el .equals, puede usar el método .equals (), al igual que lo hace con las cadenas.

for(CategoryData c:kategoriler)
{
  if (pgd.categoryId.equals(c.id))
  {
      out.print("2-find equal "+c.id);
  }
}

El uso de == simplemente compara las referencias del objeto.

Respondido el 08 de enero de 11 a las 21:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.