2012-05-22 17 views
5

मैं जेपीए उपयोग कर रहा हूँ द्वारा संस्थाओं के लिए क्वेरी करने के लिए कैसे और मैं निम्नलिखित इकाई है:अपने संग्रह मूल्य

@Entity 
@Table(name="favorites_folders") 
public class FavoritesFolder { 

    private static final long serialVersionUID = 1L; 

    @Id 
    private String id; 

    @NotNull 
    @Size(min = 1, max = 50) 
    public String name; 

    @ElementCollection(fetch = FetchType.LAZY) 
    @CollectionTable(
     name="favorites_products", 
     [email protected](name="folder_id") 
     ) 
    @Column(name="product_id") 
    @NotNull 
    private Set<String> productsIds = new HashSet<String>(); 
} 

मुझे क्या करना चाहते हैं FavoritesFolder संस्थाओं है कि स्ट्रिंग का एक सेट प्राप्त करने के लिए है "पसंदीदा -id "उनके productsIds सदस्य सेट में।

क्या किसी को पता है कि यह मानदंड एपीआई में कैसे किया जा सकता है?

अद्यतन:
मैं निम्नलिखित एसक्यूएल में सोच रहा हूँ चाल करना चाहिए, लेकिन मैं कैसे या तो JPQL या Criteria API में यह करने के लिए यकीन नहीं है:

select * from favorites_folders join favorites_products on favorites_folders.id = favorites_products.folder_id where favorites_products.product_id = 'favorite-id' 

उत्तर

8

FavoritesFolder का एक सेट प्राप्त करने के लिए संस्थाओं है कि उनके productsIds सदस्य में स्ट्रिंग "पसंदीदा आईडी" शामिल मानदंड का उपयोग कर सेट एपीआई आप निम्न करना चाहिए:

CriteriaBuilder cb = em.getCriteriaBuilder(); //em is EntityManager 
CriteriaQuery<FavoritesFolder> cq = cb.createQuery(FavoritesFolder.class); 
Root<FavoritesFolder> root = cq.from(FavoritesFolder.class); 

Expression<Collection<String>> productIds = root.get("productsIds"); 
Predicate containsFavoritedProduct = cb.isMember("favorite-id", productIds); 

cq.where(containsFavoritedProduct); 

List<FavoritesFolder> favoritesFolders = em.createQuery(cq).getResultList(); 

अधिक जानकारी ओ एन Collections in JPQL and Criteria Queries

+1

मैं इस विषय हम आईडी के लिए reffering रहे हैं और इसलिए वे मैच के लिए समान होना जरूरी में पता की तरह एक मानदंड क्वेरी लिख सकते हैं, लेकिन मान लें कि हमारे पास 'संग्रह ' है, इसके बजाय, क्या हम अनिवार्य रूप से एक ही चीज़ कर सकते हैं लेकिन किसी आइटम को 'बराबर' होने की आवश्यकता के बजाय, हमारे पास 'LIKE' का उपयोग करके एक आइटम MATCH हो सकता है? – dominicbri7

+3

@ dominicbri7 संबंधित [प्रश्न] पर (http://stackoverflow.com/questions/7066122/how-to-make-a-like-query-to-elementcollection-of-type-map?rq=1) मैंने पाया समाधान। रूट क्लास 'cb.like (से .join (" सेब ") पर जॉइन विधि का उपयोग करें। (" रंग "), टेक्स्ट पैरामीटर) – cirovladimir

1

बस एक और तरीका

@Entity 
public class UserCategory implements Serializable { 
private static final long serialVersionUID = 8261676013650495854L; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@ElementCollection 
private List<String> categoryName; 


(...) 
} 

IN का उपयोग करके तो फिर तुम

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<UserCategory> q = cb.createQuery(UserCategory.class); 
    Root<UserCategory> root = q.from(UserCategory.class); 

    Predicate predicate = cb.conjunction(); 
    Predicate p1 = cb.equal(root.get(UserCategory_.targetSiteType), siteType.getName()); 
    Predicate p2 = root.get(UserCategory_.categoryName).in(category); 
    predicate = cb.and(p1,p2); 

    q.where(predicate); 

    TypedQuery<UserCategory> tq = entityManager.createQuery(q); 
    List<UserCategory> all = tq.getResultList(); 

    if (all == null || all.size() == 0){ 
     return null; 
    }else if (all.size() > 1){ 
     throw new Exception("Unexpected result - "+all.size()); 
    }else{ 
     return all.get(0); 
    } 
संबंधित मुद्दे