Nói chung, bạn không phải "truyền" giá trị, trên thực tế, bạn chỉ cần chuyển các giá trị ở dạng chúng được lưu trữ.
Nếu chúng tôi cho rằng trường của bạn chỉ được chú thích là @Enumerated(EnumType.STRING)
cột sẽ là một trường varchar thuần túy. (Ánh xạ một kiểu java thành một enum postgres là một chủ đề lớn khác.)
Nếu bây giờ bạn muốn so sánh danh sách Status
của mình Các trường hợp enum với các giá trị chuỗi liên quan trong db, hãy chuyển nó dưới dạng tập hợp các chuỗi, nói cách khác, gọi nó là toString()
nếu đó là java enum
.
Ví dụ. đây là enum của bạn:
public enum EntityStatus {
A, B, C;
}
Đây là Pháp nhân của bạn:
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;
}
}
Đây có thể là mã của bạn để lọc:
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();
}
Hoặc theo cách trước 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();
}
Vì vậy, chỉ cần lọc một tập hợp các giá trị là có thể.