sql >> Base de Datos >  >> RDS >> PostgreSQL

Hibernate @Filter colección de enumeraciones

No tiene que "convertir" el valor en general, de hecho, solo tiene que pasar los valores en la forma en que están almacenados.

Si asumimos que su campo solo se anotó como @Enumerated(EnumType.STRING) la columna sería un campo varchar simple. (Asignar un tipo Java a una enumeración de postgres es otro gran tema).

Si ahora desea comparar su lista de Status instancias de enumeración con los valores de cadena relacionados en la base de datos, páselo como una colección de cadenas, en otras palabras, llámelo toString() método si es un Java enum .

P.ej. esta fue su enumeración:

public enum EntityStatus {
    A, B, C;
}

Esta fue su Entidad:

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ParamDef;

@Entity
@FilterDef(name = "byMultipleStates", defaultCondition = "status in (:states)", parameters = @ParamDef(name = "states", type = "string"))
@Filter(name = "byMultipleStates", condition = "status in (:states)")
public class StatusEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Enumerated(EnumType.STRING)
    private EntityStatus status;

    public long getId() {
        return id;
    }

    public EntityStatus getStatus() {
        return status;
    }

    public void setStatus(EntityStatus status) {
        this.status = status;
    }

}

Este podría ser su código para filtrar:

public List<StatusEntity> filterByStates(final Set<EntityStatus> states) {
    final Session hibernateSession = entityManager.unwrap(Session.class);
    hibernateSession.enableFilter("byMultipleStates").setParameterList("states",
            states.stream().map(state -> state.toString()).collect(Collectors.toList()));
    final Query query = hibernateSession.createQuery("SELECT e FROM StatusEntity e");

    return query.list();
}

O en el camino anterior a Java 8:

public List<StatusEntity> filterByStates(final Set<EntityStatus> states) {
    final Set<String> statesAsString = new HashSet<>();
    for (final EntityStatus state : states) {
        statesAsString.add(state.toString());
    }

    final Session hibernateSession = entityManager.unwrap(Session.class);
    hibernateSession.enableFilter("byMultipleStates").setParameterList("states", statesAsString);
    final Query query = hibernateSession.createQuery("SELECT e FROM StatusEntity e");

    return query.list();
}

Por lo tanto, solo es posible filtrar una colección de valores.