2010-12-11 10 views
5

क्या किसी के पास डेटाबेस से 10 यादृच्छिक अद्वितीय वस्तुओं की सूची कैसे प्राप्त करें, इस पर एचक्यूएल क्वेरी है?हाइबरनेट के साथ 10 यादृच्छिक अद्वितीय वस्तुओं की सूची कैसे प्राप्त करें?

यह डेटाबेस में नहीं किया जाना चाहिए आवेदन में नहीं। मैं ऐसा कुछ प्राप्त करना चाहता हूं जिसमें मेरे वर्तमान समाधान की तुलना में बेहतर प्रदर्शन हो, जो कि दायर की गई सूची प्राप्त करने के लिए 10 अनुरोध करता है।

उत्तर

4

मैं किसी भी तरह से कोई HQL विशेषज्ञ हूँ, लेकिन एसक्यूएल में आप

select ... order by RANDOM() limit 10 
googling के एक बिट के साथ

तो साथ ऐसा होता है, मैं पता लगा limit bit और random bit कैसे करना है।

+0

कृपया अपनी पोस्ट में [हस्ताक्षर या टैगलाइन का उपयोग न करें] (http://stackoverflow.com/faq#signatures)। – meagar

0

कृपया टिप्पणी करने और सुधार पोस्ट करने के लिए स्वतंत्र महसूस करें। यह मैं क्या मिल गया है:

public List<Item> getRandomTenItems() { 

    DetachedCriteria criteria = DetachedCriteria.forClass(Item.class).addOrder(Order.desc("id")); 
    List<Item> idlist = new LinkedList<Item>(getHibernateTemplate().findByCriteria(criteria, 0, 1)); 
    long max = idlist.get(0).getId(); 

    criteria = DetachedCriteria.forClass(Item.class).addOrder(Order.asc("id")); 
    idlist = new LinkedList<Item>(getHibernateTemplate().findByCriteria(criteria, 0, 1)); 
    long min = idlist.get(0).getId(); 

    List<Item> rtn = new LinkedList<Item>(); 
    HashSet<Long> ids = new HashSet<Long>(); 
    int i=0; 
    while(i<10) { 
     long itemId = RandomUtils.rand(min, max); 
     if(ids.contains(itemId)) continue; 
     List<Item> list = new LinkedList<Item>(getHibernateTemplate().findByNamedParam(
       "from Item where archived = false and available = true and id = :itemId", "itemId", itemId)); 
     if(!list.isEmpty()){ 
      rtn.add(list.get(0)); 
      ids.add(list.get(0).getId()); 
      i++; 
     } 
    } 
    return rtn; 
} 
7

HQL की तरह कुछ होगा:

session.createQuery("select o from Object o order by rand()") 
    .setMaxResults(10) 
    .list() 

रैंड() के माध्यम से करने के लिए डेटाबेस इसलिए जो कुछ भी समारोह अपने डेटाबेस का उपयोग करता है के साथ इस की जगह पारित कर दिया है।

संबंधित मुद्दे

 संबंधित मुद्दे