2 दिनों की पीड़ा के बाद, हाइबरनेट स्रोत कोड के एएसटी प्रसंस्करण का विश्लेषण करते हुए मैंने आखिरकार हार मान ली !! =P .. वास्तव में अभी तक Oracle 11g बोली उपलब्ध नहीं है।
इसलिए, मैंने रणनीति बदल दी और इसे निम्नलिखित परिवर्तनों के साथ हल किया:
<मजबूत>1. Oracle डेटाबेस पर फॉलो फंक्शन बनाएं
CREATE OR REPLACE FUNCTION INTERVAL_HOURS_AGO(HOURS_PARAM IN NUMBER)
RETURN DATE DETERMINISTIC
IS TIME_AGO DATE;
BEGIN
SELECT (SYSDATE - INTERVAL '1' HOUR * HOURS_PARAM) INTO TIME_AGO FROM DUAL;
RETURN(TIME_AGO);
END;
जहां-क्लॉज पर इसका उपयोग करते समय प्रदर्शन समस्या से बचने के लिए फ़ंक्शन पर नियतात्मक संकेत बहुत महत्वपूर्ण है। लिंक पर इसके बारे में अधिक जानकारी:http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/
<मजबूत>2. एक कस्टम Oracle बोली वर्ग बनाएं और नया फ़ंक्शन पंजीकृत करें।
public class Oracle11gDialectExtended extends Oracle10gDialect {
public Oracle11gDialectExtended() {
super();
registerFunction("interval_hours_ago",
new StandardSQLFunction("INTERVAL_HOURS_AGO", StandardBasicTypes.DATE));
}
}
तो, बस इसे @Formula पर कॉल करें:
@Formula(" INTERVAL_HOURS_AGO( SHOW_LIMIT_HOURS ) ")
private Date showLimitDate;
या HQL / NamedQuery पर:
select p from Product p
where p.createdAt > interval_hours_ago(60)