आपको सामान्य रूप से मूल्य को "कास्ट" करने की आवश्यकता नहीं है, वास्तव में आपको केवल मानों को उसी रूप में पास करना होगा जिस रूप में वे संग्रहीत हैं।
यदि हम मान लें कि आपके क्षेत्र को केवल @Enumerated(EnumType.STRING)
के रूप में एनोटेट किया गया था कॉलम एक सादा वर्चर फ़ील्ड होगा। (एक जावा प्रकार को पोस्टग्रेज एनम में मैप करना एक और बड़ा विषय है।)
यदि आप अब अपनी Status
की सूची की तुलना करना चाहते हैं डीबी में संबंधित स्ट्रिंग मानों के साथ एनम इंस्टेंस, इसे स्ट्रिंग्स के संग्रह के रूप में पास करें, दूसरे शब्दों में, इसे toString()
कहें विधि अगर यह एक जावा है 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();
}
या जावा 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();
}
इसलिए मानों के संग्रह के लिए केवल फ़िल्टर करना संभव है।