PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Hibernate @Filter колекция от enum

Не е нужно да „прехвърляте“ стойността като цяло, всъщност просто трябва да подадете стойностите във формата, в която са съхранени.

Ако приемем, че вашето поле е било анотирано само като @Enumerated(EnumType.STRING) колоната ще бъде обикновено поле varchar. (Съпоставянето на java тип към postgres enum е друга голяма тема.)

Ако сега искате да сравните вашия списък с Status enum екземпляри със свързаните низови стойности в db, предайте го като колекция от низове, с други думи, извикайте го toString() метод, ако е java enum .

напр. това беше вашето изброяване:

public enum EntityStatus {
    A, B, C;
}

Това беше вашият обект:

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

}

Това може да е вашият код за филтриране:

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

Или по начина преди 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();
}

Така че е възможно просто филтриране за колекция от стойности.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Текущ брой Общо с PostgresQL

  2. Попълнете таблицата с данни за липсваща дата (postgresql, червено отместване)

  3. Размерът на базата данни на PostgreSQL е по-малък след архивиране/зареждане на Heroku

  4. Има ли екраниращ синтаксис за psql променлива във функциите на PostgreSQL?

  5. psql:не можа да се свърже със сървър:Няма такъв файл или директория (Mac OS X)