यह, ज्यादातर @Yogendra सिंह के जवाब पर आधार है एक मोड़ के साथ यह अधिक ग्रहणीय बनाने के लिए:
केवल बात मैं सलाह कर सकते हैं के रूप में isEmpty()
समारोह और if
बयान में != null
और थोड़ा पुनर्गठन उपयोग करने के लिए है एकाधिक वैकल्पिक तर्क की सामान्य रूप से देखी गई स्थिति के लिए)
मानदंड API का उद्देश्य आपको प्रोग्राम को अपनी क्वेरी लिखना है। इस तरह की गतिशील सुविधा आपके कोड में संभालने की उम्मीद है।
आम तौर पर हम इस से वैकल्पिक मापदंड बनाने:
@Override
public List<SomeThing> findBySearchParams(SearchParam searchParam) {
// create criteria with mandatory search criteria
Criteria criteria = sessionFactory.getCurrentSession()
.createCriteria(SomeClass.class);
.add(Restriction("someField", searchParam.getSomeField()));
// add "id" only if "someId" contains value
if(searchParam.getSomeIds() != null && !searchParam.getSomeIds().empty()) {
criteria.add(Restrictions.in("id", searchParam.getSomeIds()));
}
// add "anotherField" only if "anOptionalField" is not null
if(searchParam.getAnOptionalField() != null) {
criteria.add(Restrictions.in("anotherField", searchParam.getAnOptionalField()));
}
return criteria.list();
}
संपादित करें: अपने आप को बनाने के लिए
हालांकि हाइबरनेट नहीं है (अभी तक) के लिए एक और अधिक सुरुचिपूर्ण तरीका प्रदान करते हैं, आप कुछ लिख सकते हैं यह अधिक सुरुचिपूर्ण दिखता है:
class SmartCriteriaBuilder {
private Criteria criteria;
SmartCriteriaBuilder (Criteria criteria) { this.criteria = criteria;}
SmartCriteriaBuilder in(String field, Collection values) {
if (!empty(values)) {
this.criteria.add(Restrictions.in(field,values));
}
}
// all other kind of restrictions ....
Criteria toCriteria() {
return this.criteria;
}
}
फिर आप कुछ स्मार्ट दिख सकते हैं:
SmartCriteriaBuilder criteriaBuilder =
new SmartCriteriaBuilder(sessionFactory.getCurrentSession().createCriteria());
criteriaBuilder .in("someField", listPossiblyNullOrEmpty);
return criteriaBuilder .toCriteria().list();
स्रोत
2012-10-22 04:29:55