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.