PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Hibernate @Filter koleksi enum

Anda tidak harus "melempar" nilai secara umum, sebenarnya Anda hanya perlu meneruskan nilai dalam bentuk penyimpanannya.

Jika kami menganggap bidang Anda hanya diberi keterangan sebagai @Enumerated(EnumType.STRING) kolom akan menjadi bidang varchar biasa. (Memetakan tipe java ke postgres enum adalah topik besar lainnya.)

Jika sekarang Anda ingin membandingkan daftar Status enum instance dengan nilai string terkait di db, berikan sebagai kumpulan string, dengan kata lain, sebut saja toString() metode jika itu adalah Java enum .

Misalnya. ini adalah enum Anda:

public enum EntityStatus {
    A, B, C;
}

Ini adalah Entitas Anda:

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

}

Ini bisa menjadi kode Anda untuk difilter:

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

Atau di jalan sebelum 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();
}

Jadi hanya memfilter kumpulan nilai yang memungkinkan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menampilkan Total Bulanan dari Beberapa Kolom di PostgreSQL

  2. Sisipkan beberapa baris dalam satu tabel berdasarkan nomor di tabel lain

  3. Kesalahan saat mendorong data ke Heroku:perpindahan zona waktu di luar jangkauan

  4. Tabel Temp dump PostgreSQL

  5. PostgreSQL - Mendapatkan data statistik