PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Hibernate @Filter kolekcja wyliczeń

Nie musisz ogólnie "rzucać" wartości, w rzeczywistości wystarczy przekazać wartości w formie, w jakiej są przechowywane.

Jeśli założymy, że Twoje pole zostało opisane tylko jako @Enumerated(EnumType.STRING) kolumna byłaby zwykłym polem varchar. (Odwzorowanie typu java na wyliczenie postgres to kolejny duży temat.)

Jeśli chcesz teraz porównać swoją listę Status wylicz instancje z powiązanymi wartościami ciągów w bazie danych, przekaż je jako kolekcję ciągów, innymi słowy, wywołaj to toString() metoda, jeśli jest to enum java .

Np. to było twoje wyliczenie:

public enum EntityStatus {
    A, B, C;
}

To była Twoja jednostka:

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

}

To może być Twój kod do filtrowania:

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

Lub tak jak przed Javą 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();
}

Możliwe jest więc tylko filtrowanie dla zbioru wartości.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mkdir /mnt/data:system plików tylko do odczytu Wycofanie ponownego uruchomienia kontenera postgres nie powiodło się

  2. Jak udokumentować kod bazy danych, aby zobaczyć zależności między obiektami bazy danych?

  3. Django-DB-Migration:nie można ALTER TABLE, ponieważ ma oczekujące zdarzenia wyzwalające

  4. Postgres COPY TO NULL liczb całkowitych

  5. Bezpieczny wątkowo obiekt PQconn