2013-11-27 3 views
6

के रूप में एनम का उपयोग करके हाइबरनेट क्वेरी, मुझे काम करने के लिए हाइबरनेट (HSQLDB का उपयोग करके) कोई भाग्य नहीं मिल रहा है। क्वेरी कोड लगता है:पैरामीटर

Query query = session.createQuery("from "+tableName+" where CURRENCY = :currency"); 
query.setParameter("currency",currency); 
List<ExchangeRate> list = query.list(); 

मैं लगातार हो ": org.hsqldb.HsqlException: की वजह से रूपांतरण में असंगत डेटा प्रकार":

org.hibernate.exception.SQLGrammarException: could not execute query 
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
    at org.hibernate.loader.Loader.doList(Loader.java:2529) 
    at org.hibernate.loader.Loader.doList(Loader.java:2512) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342) 
    at org.hibernate.loader.Loader.list(Loader.java:2337) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1275) 
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 
    at com.rockymountaineer.wsapi.db.test.ExchangeRateDAOTest.getRate(ExchangeRateDAOTest.java:27) 
    at com.rockymountaineer.wsapi.db.test.ExchangeRateDAOTest.main(ExchangeRateDAOTest.java:39) 
Caused by: java.sql.SQLSyntaxErrorException: incompatible data type in conversion 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.throwError(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.setParameter(Unknown Source) 
    at org.hsqldb.jdbc.JDBCPreparedStatement.setBytes(Unknown Source) 
    at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$1.doBind(VarbinaryTypeDescriptor.java:57) 
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:93) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275) 
    at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:66) 
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:612) 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1875) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1836) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1816) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:900) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342) 
    at org.hibernate.loader.Loader.doList(Loader.java:2526) 
    ... 10 more 
Caused by: org.hsqldb.HsqlException: incompatible data type in conversion 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.types.NumberType.convertToDefaultType(Unknown Source) 
    ... 24 more 

वर्ग इतना की तरह टिप्पणी की जाती है:

@Column(name="CURRENCY", nullable=false) 
public CurrencyType getCurrency() { 
    return currency; 
} 

... और Enum प्रकार की तरह दिखता है:

public enum CurrencyType { 
    CAD, AUD, EUR, GBP, USD;  
    /** 
    * @param currency 
    * @return 
    */ 
    public static CurrencyType getByCurrency(String currency) { 
     if(currency!=null) { 
      for(CurrencyType type : CurrencyType.values()) { 
       if(type.name().equals(currency)) return type; 
      } 
     } 
     return null; 
    } 
} 

जो मैं हाइबरनेट दस्तावेज़ों से समझता हूं, उससे पूरी तरह से काम करना चाहिए - यह उल्लेख न करें कि मैं वर्तमान में अन्य हाइबरनेट विधियों का उपयोग करके वस्तुओं को सहेजने, संपादित करने, हटाने, क्वेरी (आईडी द्वारा) करने में सक्षम हूं - लेकिन "createQuery" जिद्दी साबित कर रहा है ।

यदि कोई मदद कर सकता है तो मैं ईमानदारी से इसकी सराहना करता हूं! चीयर्स,

एलेक्स

उत्तर

8

... ठीक है - यह पता लगा। अगर किसी और को भ्रमित कर दिया गया है, तो यहां मैंने जो खोजा है। ऐसा लगता है कि डिफ़ॉल्ट रूप से, तालिका औपचारिक मान (मेरे मामले में CurrencyType.ordinal()) का उपयोग करके बनाई गई है, इसलिए तालिका बनाई जाने पर कॉलम CURRENCY INTEGER NOT NULL जैसा दिखता है।

यह आदर्श से कम है जैसे कि मैं एनम प्रकार (यानी मानों का क्रम) बदलता हूं, यह सब कुछ तोड़ देगा। अच्छी खबर यह है कि मैं विधि करने के लिए एक @Enumerated(EnumType.STRING) जोड़कर String मूल्य (CurrencyType.name()) को बचाने के लिए यह मजबूर कर सकते हैं है, इसलिए इसे तरह दिखेगा:

@Enumerated(EnumType.STRING) 
    @Column(name="CURRENCY", nullable=false) 
    public CurrencyType getCurrency() { 
     return currency; 
    } 

... अब सभी डेटा पुन: दर्ज करने।