sql >> Databáze >  >> RDS >> PostgreSQL

Hibernate @Filter kolekce výčtů

Obecně nemusíte "přenášet" hodnotu, ve skutečnosti stačí předat hodnoty ve formě, v jaké jsou uloženy.

Pokud předpokládáme, že vaše pole bylo označeno pouze jako @Enumerated(EnumType.STRING) sloupec by bylo obyčejné pole varchar. (Další velké téma je mapování typu java na postgres enum.)

Pokud nyní chcete porovnat svůj seznam Status vyjmenovat instance se souvisejícími řetězcovými hodnotami v db, předat to jako kolekci řetězců, jinými slovy, zavolat to toString() metoda, pokud se jedná o java enum .

Např. toto byl váš výčet:

public enum EntityStatus {
    A, B, C;
}

Toto byla vaše entita:

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

}

Může to být váš kód k filtrování:

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

Nebo způsobem před 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();
}

Je tedy možné pouze filtrování pro kolekci hodnot.




  1. MySQL spojte více řádků jako sloupce

  2. Proč musí mysqli_connect() obdržet parametr hesla bez šifrování?

  3. 4 způsoby, jak změnit časové pásmo v Oracle

  4. Jak nastavit připojovací řetězec s Entity Framework