आप अपना Specification
लपेट सकते हैं सहायक वर्ग में परिभाषाएँ:
public class DelegationSpecificationsHelper {
public static Specification<Domain> notificationContactSpec(String contact) {
return (root, query, cb) -> cb.equal(root.join("notification").get("contact"), contact);
}
public static Specification<Domain> idSpec(SearchCriteria searchCriteria) {
switch (criteria.getOperation()) {
case ":":
if (root.get(criteria.getKey()).getJavaType() == String.class) {
return builder.like(
root.<String>get(criteria.getKey()),
"%" + criteria.getValue() + "%");
} else {
return builder.equal(root.get(criteria.getKey()),
criteria.getValue());
}
case "=":
return builder.equal(root.get(criteria.getKey()),
criteria.getValue());
default:
return null;
}
}
}
और फिर आप इसे इस तरह इस्तेमाल कर सकते हैं:
Specifications<Domain> specifications = Specifications.where(DelegationSpecificationsHelper.idSpec(new SearchCriteria("id", "=", domainId))
.and(DelegationSpecificationsHelper.notificationContactSpec("someSearchString"));
स्थिर आयात और कुछ रिफैक्टरिंग के बाद:
SearchCriteria idCriteria = new SearchCriteria("id", "=", domainId)
Specifications<Domain> specifications =
Specifications.where(idSpec(idCriteria)
.and(notificationContactSpec("someSearchString"));
बेशक आपको यहां से हार्डकोडेड मानों से छुटकारा पाना चाहिए:cb.equal(root.join("notification").get("contact"), contact);
और इसके बजाय कुछ डीटीओ ऑब्जेक्ट या जेनरेट किए गए जेपीए मेटा मॉडल का उपयोग करें।
मेटामॉडल जोड़ने के बाद यह इस तरह दिख सकता है:
public static Specification<Domain> notificationContactSpec(String contactValue) {
return (root, query, cb) -> cb.equal(root.join(Domain_.notification).get(Notification_.contact), contactValue);
}
मेटामॉडल पीढ़ी के बारे में अधिक जानकारी:https://docs। jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html