मैं इस तरह कुछ उपयोग कर रहा हूं और यह बहुत तेज़ काम करता है। मुझे देशी एसक्यूएल का उपयोग करने से भी नफरत है क्योंकि हमारे आवेदन को किसी भी डेटाबेस पर काम करना चाहिए।
फ़ॉलिंग एक बहुत ही अनुकूलित एसक्यूएल में resutls और नक्शे के रिकॉर्ड की सूची लौटाता है।
String hql = "select distinct " +
"t.uuid as uuid, t.title as title, t.code as code, t.date as date, t.dueDate as dueDate, " +
"t.startDate as startDate, t.endDate as endDate, t.constraintDate as constraintDate, t.closureDate as closureDate, t.creationDate as creationDate, " +
"sc.category as category, sp.priority as priority, sd.difficulty as difficulty, t.progress as progress, st.type as type, " +
"ss.status as status, ss.color as rowColor, (p.rKey || ' ' || p.name) as project, ps.status as projectstatus, (r.code || ' ' || r.title) as requirement, " +
"t.estimate as estimate, w.title as workgroup, o.name || ' ' || o.surname as owner, " +
"ROUND(sum(COALESCE(a.duration, 0)) * 100/case when ((COALESCE(t.estimate, 0) * COALESCE(t.progress, 0)) = 0) then 1 else (COALESCE(t.estimate, 0) * COALESCE(t.progress, 0)) end, 2) as factor " +
"from " + Task.class.getName() + " t " +
"left join t.category sc " +
"left join t.priority sp " +
"left join t.difficulty sd " +
"left join t.taskType st " +
"left join t.status ss " +
"left join t.project p " +
"left join t.owner o " +
"left join t.workgroup w " +
"left join p.status ps " +
"left join t.requirement r " +
"left join p.status sps " +
"left join t.iterationTasks it " +
"left join t.taskActivities a " +
"left join it.iteration i " +
"where sps.active = true and " +
"ss.done = false and " +
"(i.uuid <> :iterationUuid or it.uuid is null) " + filterHql +
"group by t.uuid, t.title, t.code, t.date, t.dueDate, " +
"t.startDate, t.endDate, t.constraintDate, t.closureDate, t.creationDate, " +
"sc.category, sp.priority, sd.difficulty, t.progress, st.type, " +
"ss.status, ss.color, p.rKey, p.name, ps.status, r.code, r.title, " +
"t.estimate, w.title, o.name, o.surname " + sortHql;
if (logger.isDebugEnabled()) {
logger.debug("Executing hql: " + hql);
}
Query query = hibernateTemplate.getSessionFactory().getCurrentSession().getSession(EntityMode.MAP).createQuery(hql);
for(String key: filterValues.keySet()) {
Object valueSet = filterValues.get(key);
if (logger.isDebugEnabled()) {
logger.debug("Setting query parameter for " + key);
}
if (valueSet instanceof java.util.Collection<?>) {
query.setParameterList(key, (Collection)filterValues.get(key));
} else {
query.setParameter(key, filterValues.get(key));
}
}
query.setString("iterationUuid", iteration.getUuid());
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
if (logger.isDebugEnabled()) {
logger.debug("Query building complete.");
logger.debug("SQL: " + query.getQueryString());
}
return query.list();
क्या आप एक रिपोर्ट बनाने की कोशिश कर रहे हैं, या आप वस्तुओं का एक गुच्छा लोड करने की कोशिश कर रहे हैं? यदि आप सिर्फ एक रिपोर्ट बनाने की कोशिश कर रहे हैं, तो इसे एसक्यूएल में करें जैसा आपने कहा था और इसके साथ किया जाना चाहिए। – Zak
@Zak: मेरे पास jpa + spring + jsf में एक वेब अनुप्रयोग है जो काम करता है। लेकिन इसका प्रदर्शन बेहतर होना चाहिए। और, और भी महत्वपूर्ण बात यह है कि इस समय इसे संभालने से कहीं अधिक बड़े डेटासेट को संभालने में सक्षम होना चाहिए। 1) पहली क्वेरी के साथ एक समस्या है जिसे मैं नहीं जानता कि इसे 'hql' या' jpa क्वेरी भाषा 'में कैसे लिखना है। मैं सादे वर्ग का उपयोग नहीं करना चाहता, imho यह एक अंतिम उपाय है। 2) दूसरी क्वेरी के साथ समस्या यह है कि मुझे नहीं पता कि 'जेपीए' में fetch आकार कैसे सेट करें और मुझे यह भी नहीं पता कि इस स्थिति को 'जेपीए' के साथ कैसे संभाला जाए: परिणामस्वरूप कोई लूप नहीं है, मैं नहीं करता हूं ' टी 'अगली' fetch लोड करने के बारे में पता नहीं है। – Roman