2013-11-27 16 views
6

Tôi không có may mắn khi nhận được truy vấn hibernate (sử dụng HSQLDB) để hoạt động. Mã truy vấn trông giống như:Truy vấn Hibernate sử dụng Enum làm tham số

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

tôi luôn được "Nguyên nhân: org.hsqldb.HsqlException: loại không tương thích dữ liệu trong chuyển đổi":

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 

Lớp được chú thích như sau:

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

... và kiểu Enum trông giống như:

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; 
    } 
} 

Từ những gì tôi hiểu bằng tài liệu Hibernate, điều này hoàn toàn hoạt động - chưa kể rằng tôi hiện có thể lưu, chỉnh sửa, xóa, truy vấn (bằng id) đối tượng bằng các phương thức ngủ đông khác - nhưng "createQuery" đang chứng minh cứng đầu .

Nếu có ai có thể giúp tôi chân thành cảm kích! Chúc mừng,

Alex

Trả lời

8

... ok - figured it out. Trong trường hợp bất cứ ai khác là nhầm lẫn, đây là những gì tôi phát hiện ra. Có vẻ như theo mặc định, bảng được tạo bằng cách sử dụng giá trị thứ tự (trong trường hợp của tôi CurrencyType.ordinal()) để cột kết thúc lên trông giống như CURRENCY INTEGER NOT NULL khi bảng được tạo.

Điều này ít lý tưởng như thể tôi thay đổi loại Enum (tức là thứ tự của các giá trị), điều này sẽ phá vỡ mọi thứ. Tin tốt lành là tôi có thể buộc nó để lưu các giá trị String (CurrencyType.name()) bằng cách thêm một @Enumerated(EnumType.STRING) để phương pháp này, vì vậy nó sẽ trông giống như:

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

... bây giờ nhập lại tất cả các dữ liệu.

Các vấn đề liên quan