PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Hibernate @Filter Sammlung von Aufzählungen

Sie müssen den Wert im Allgemeinen nicht "umwandeln", sondern nur die Werte in der Form übergeben, in der sie gespeichert sind.

Angenommen, Ihr Feld wurde nur als @Enumerated(EnumType.STRING) kommentiert die Spalte wäre ein einfaches Varchar-Feld. (Das Zuordnen eines Java-Typs zu einer Postgres-Enumeration ist ein weiteres großes Thema.)

Wenn Sie nun Ihre Liste mit Status vergleichen möchten enum-Instanzen mit den zugehörigen String-Werten in der Datenbank, übergeben Sie sie als Sammlung von Strings, mit anderen Worten, rufen Sie sie toString() auf -Methode, wenn es sich um eine Java enum handelt .

Z.B. Dies war Ihre Aufzählung:

public enum EntityStatus {
    A, B, C;
}

Dies war Ihre Entität:

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

}

Dies könnte Ihr zu filternder Code sein:

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

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

Es ist also nur eine Filterung nach einer Sammlung von Werten möglich.