2011-04-18 20 views
9

मैं सभी उपयोगकर्ताओं को उस फ़ोल्डर के लिए लाने की कोशिश कर रहा हूं जहां उपयोगकर्ता किसी निश्चित तिथि के बाद बनाया गया था। उपयोगकर्ता और फ़ोल्डर के बीच का रिश्ता एक अलग तालिका में रहता है।जेपीए 2 कोई स्पष्ट चयन नहीं है और एक निहित एक ठंडा निर्धारित नहीं किया गया है

इस क्वेरी मैं के साथ आया है, लेकिन यह अपवाद

कोई स्पष्ट चयन thorws और एक अंतर्निहित एक ठंड

कोड

@Override 
public List<RetailPostUserTbl> getNewUsersForSiteSince(Date date, Integer siteId) 
{ 
    List<RetailPostUserTbl> toReturn = new ArrayList<RetailPostUserTbl>(); 
    EntityManager em = getEntityManager(); 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 

    Class<RpUserFolderMapTbl> userFolderPC = userFolderMapDAO.getPersistentClass(); 

    CriteriaQuery<RpUserFolderMapTbl> mapQuery = cb.createQuery(userFolderPC); 
    Root<RpUserFolderMapTbl> root = mapQuery.from(userFolderPC); 
    Path<Integer> folderIdPath = root.get(RpUserFolderMapTbl_.folder).get(FolderTbl_.folderId); 

    Predicate folderCondition = cb.equal(folderIdPath, siteId); 

    Subquery<RetailPostUserTbl> rpSubQ = mapQuery.subquery(persistentClass); 
    Root<RetailPostUserTbl> subQRoot = rpSubQ.from(persistentClass); 
    Path<UserTbl> userPath = subQRoot.get(RetailPostUserTbl_.user); 
    Path<Date> userCreatedPath = userPath.get(UserTbl_.userCreateDate); 
    Predicate userCreateDateCondition = cb.greaterThanOrEqualTo(userCreatedPath, date); 
    rpSubQ.where(userCreateDateCondition); 

    mapQuery.where(cb.and(folderCondition, cb.exists(rpSubQ))); 

    TypedQuery<RpUserFolderMapTbl> query = em.createQuery(mapQuery); 
    List<RpUserFolderMapTbl> results = query.getResultList(); 
    for (RpUserFolderMapTbl result : results) 
    { 
     RetailPostUserTbl rpuser = result.getUser().getRetailPostUser(); 
     toReturn.add(rpuser); 
    } 
    return toReturn; 
} 

किसी को भी निर्धारित नहीं किया जा पता है कि यह क्यों काम नहीं कर रहा है?

उत्तर

8

मुझे आज भी वही त्रुटि मिली थी। मजाकिया बात यह है कि मैंने हाइबरनेट 3.6.3 से अपना उदाहरण पकड़ा। फाइनल डॉक्स। उनका उदाहरण है:

CriteriaQuery query = builder.createQuery(); 
Root<Person> men = query.from(Person.class); 
Root<Person> women = query.from(Person.class); 
Predicate menRestriction = builder.and(
    builder.equal(men.get(Person_.gender), Gender.MALE), 
    builder.equal(men.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
Predicate womenRestriction = builder.and(
    builder.equal(women.get(Person_.gender), Gender.FEMALE), 
    builder.equal(women.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
query.where(builder.and(menRestriction, womenRestriction)); 

त्रुटि को "ठीक करने" के लिए मैंने जो किया वह स्पष्ट रूप से रूट का चयन करता है। नोट मुझे इसे हल करने के लिए एक रूट बनाना था। यहां मेरा उदाहरण है:

CriteriaQuery query = builder.createQuery(); 
Root<Person> personRoot = query.from(Person.class); 
Predicate menRestriction = builder.and(
    builder.equal(personRoot.get(Person_.gender), Gender.MALE), 
    builder.equal(personRoot.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
Predicate womenRestriction = builder.and(
    builder.equal(personRoot.get(Person_.gender), Gender.FEMALE), 
    builder.equal(personRoot.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
query.select(personRoot); 
query.where(builder.and(menRestriction, womenRestriction)); 

मुझे क्या पता नहीं चल सकता है कि एक निहित चयन क्यों नहीं किया जा सका। हाइबरनेट के उदाहरण में उपयोग की जाने वाली एकमात्र कक्षा Person.class है। जब मैं थोड़ी देर में खोदता हूं तो मैं अपनी प्रतिक्रिया अपडेट करूंगा।

18

आपको "सबक्वायरीज़" के लिए भी स्पष्ट रूप से चयन करना चाहिए।

rpSubQ.select(subQRoot); 

शुभकामनाएँ!