प्रारंभिक पोस्ट के 4 साल बाद, कुछ घटनाक्रम हैं। स्प्रिंग 4 और हाइबरनेट 4 का उपयोग करना अब स्पेल अभिव्यक्ति का उपयोग करके हाइबरनेट को 'ट्रिक' करना संभव है। उदाहरण के लिए:
एनम:
package com.mycompany.enums
public enum Status {
INITIAL, PENDING, REJECTED, APPROVED, SHIPPED, DELIVERED, COMPLETE;
}
यहाँ 'फ़िल्टर' नामक एक रैपर क्लास है, जिसे हम रिपॉजिटरी फ़िल्टरिंग विधि से पास करेंगे।
package com.mycompany.enums
public class Filter implements Serializable {
private Integer id;
private Status status;
public String getStatusName() {
return null == status ? status : status.name();
}
}
अंत में, रिपॉजिटरी में, हम अब फ़िल्टर वर्ग का उपयोग एकल पैरामीटर के रूप में कर सकते हैं और क्वेरी का अनुवाद कर सकते हैं जो एक वस्तु के लिए शाब्दिक और स्पेल अभिव्यक्तियों का मिश्रण प्रतीत होता है:
भंडार:
package com.mycompany.repository
@Repository
public interface OrderRepository extends CrudRepository<Order, Integer> {
@Query("SELECT o from Order o "
+ "WHERE o.id = COALESCE(:#{#filter.id},o.id) "
+ "AND o.status = COALESCE(:#{T(com.mycompany.enums.Status).#filter.statusName},o.status)")
public List<Order> getFilteredOrders(@Param(value = "filter") Filter filter);
}
यह पूरी तरह से काम करता है, लेकिन कुछ अजीब कारणों से मुझे अभी तक पता नहीं चला है, यदि आप हाइबरनेट में SQL डिबगिंग को सक्षम करते हैं और बाइंडर लॉगिंग को चालू करते हैं, तो आप हाइबरनेट को इस अभिव्यक्ति को क्वेरी चर में नहीं देख पाएंगे।