PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Hibernate @Filter collection d'énumérations

Vous n'avez pas à "caster" la valeur en général, en fait il vous suffit de passer les valeurs sous la forme où elles sont stockées.

Si nous supposons que votre champ n'a été annoté que comme @Enumerated(EnumType.STRING) la colonne serait un champ varchar simple. (Le mappage d'un type java à une énumération postgres est un autre sujet important.)

Si vous voulez maintenant comparer votre liste de Status enum instances avec les valeurs de chaîne associées dans la base de données, transmettez-la comme collection de chaînes, en d'autres termes, appelez-la toString() méthode s'il s'agit d'un enum java .

Par exemple. c'était votre énumération :

public enum EntityStatus {
    A, B, C;
}

C'était votre Entité :

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;
    }

}

Cela pourrait être votre code pour filtrer :

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();
}

Ou à la manière d'avant 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();
}

Il est donc possible de filtrer uniquement une collection de valeurs.