2011-05-24 5 views
6

मैं काम नहीं कर रहा ...हाइबरनेट 3.6: एसक्यूएल बोली में registerFunction देने और समुदाय से संपर्क करें

अपने प्रोजेक्ट में, मैं हाइबरनेट 3.6.4.Final और एक कस्टम एसक्यूएल बोली का उपयोग करते हुए:

public class ServiceAppMySQL5InnoDBDialect extends MySQL5InnoDBDialect { 

    public ServiceAppMySQL5InnoDBDialect() { 
     super(); 
     registerFunction("bitwise_and", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "(?1 & ?2)")); 
     registerFunction("hasflags", new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN, "?1 & ?2 = ?2")); 
    } 

} 

एक एचक्यूएल क्वेरी में hasflags विधि का उपयोग विफल रहता है।

Query q = em 
     .createQuery(
      "SELECT o FROM " 
      + entityClass.getName() 
      + " o WHERE hasflags(o.status, :status) AND o.email = :email") 
     .setParameter("email", username) 
     .setParameter("status", status.getBitmask()); 

त्रुटि:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: (near line 1, column 50 [SELECT o FROM tv.px.domain.Owner o WHERE hasflags(o.status, :status) AND o.email = :email] 
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54) 
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47) 
    at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:261) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124) 
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:272) 

इसलिए, यह अगर ठीक तरह से कार्य पंजीकृत नहीं है के रूप में लगता है क्वेरी है। मैंने पुराने हाइबरनेट संस्करणों के साथ कई बार ऐसा किया है और यह हर समय इस तरह से काम करता है।

शायद ज़रुरत पड़े कोई इस पूछते हैं: हाँ, मैं कॉन्फ़िगर किया गया हाइबरनेट बोली का उपयोग करें:

<persistence-unit name="persistenceUnit" 
    transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 
     <property name="hibernate.dialect" value="tv.px.persistence.hibernate.ServiceAppMySQL5InnoDBDialect" /> 

     <!-- and so on --> 
    </properties> 
</persistence-unit> 

संपादित करें: SELECT खंड में मैं समस्याओं के बिना पंजीकृत कार्यों का उपयोग कर सकते हैं, लेकिन में नहीं कहां खंड।

उत्तर

13

मुझे एक ही समस्या है। यह काम करता है यदि आप कहां संशोधित करते हैं:

hasflags(o.status, :status) = true 

मुझे इसके बिना काम करने की आवश्यकता है, और इसके लिए मेरी खोज ने मुझे यहां लाया।

संबंधित मुद्दे