PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

हाइबरनेट @Enums का संग्रह फ़िल्टर करें

आपको सामान्य रूप से मूल्य को "कास्ट" करने की आवश्यकता नहीं है, वास्तव में आपको केवल मानों को उसी रूप में पास करना होगा जिस रूप में वे संग्रहीत हैं।

यदि हम मान लें कि आपके क्षेत्र को केवल @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();
}

इसलिए मानों के संग्रह के लिए केवल फ़िल्टर करना संभव है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक डीबी से दूसरे डीबी में डेटा माइग्रेट करने के लिए फ्लाईवे का उपयोग कैसे करें?

  2. पोस्टग्रेस चुनें जहां यूयूआईडी या स्ट्रिंग कहां है

  3. एक PostgreSQL तालिका से विशिष्ट पंक्तियों को INSERT SQL स्क्रिप्ट के रूप में निर्यात करें

  4. तैयार प्रश्नों को डी-आवंटित करना

  5. Postgresql फ़ंक्शन में चर के लिए एक चुनिंदा क्वेरी असाइन करें