当前位置: 首页 > 知识库问答 >
问题:

使用枚举作为参数的Hibernate查询

赏阳嘉
2023-03-14
Query query = session.createQuery("from "+tableName+" where CURRENCY = :currency");
query.setParameter("currency",currency);
List<ExchangeRate> list = query.list();
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;
}
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;
    }
}

共有1个答案

桑思远
2023-03-14

…好吧-想通了。万一别人搞糊涂了,下面是我的发现。默认情况下,表似乎是使用序数值创建的(在我的示例中为CurrencyType.ordinal()),因此在创建表时,列最终看起来像CurrencyType.ordinal()

这是不理想的,就像我改变枚举类型(即值的顺序),这将打破一切。好消息是,我可以通过向方法中添加@enumerated(enumtype.string)来强制它保存string值(currencytype.name()),这样它看起来就像:

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

...现在重新输入所有数据。

 类似资料:
  • 问题内容: 在我的MySQL数据库中,有“ gender enum(’male’,’female’)”列 我创建了枚举“ com.mydomain.myapp.enums.Gender”,并在我的实体中定义了“性别”。 现在,我想将枚举类型保留在我的MySQL数据库中,但是当我启动应用程序时,我得到: 性别列在MyApp.Person中的列类型错误。找到:枚举,预期:整数 为什么是这样?这就像我用

  • 我想使用中定义的枚举作为查询字符串中参数定义的一部分。 我在我的Swagger 2.0规范文件的< code>definitions部分定义了Swagger枚举。 我可以在其他定义中创建对它的引用: 当参数在:body中为中为

  • 我正在使用一个Spring数据JPA(4.3.5)存储库和一个查询方法,该方法在关键字子句中使用<代码>列表 给定如下实体: 使用该SQL声明: Estat是一个枚举类,类似于: 和JPA存储库,如: 当我运行(联调类): 生成的SQL是(在内存H2 DB中): 不会引发任何SQL异常,并且不会返回任何结果。但这应该返回1个结果,因为此(等效)SQL返回: 我能看到的独特区别是我如何在"(该列是V

  • 我是Spring启动的新手,并试图使用枚举作为Rest请求的参数。 这是我的枚举类: 在我的控制器类中,我使用了以下方法: 这是我的JSON: 但它不起作用。。我收到以下错误:

  • 问题内容: 在DAO中具有一个其值来自Java枚举的字段通常很有用。一个典型的示例是登录DAO,您通常在其中具有一个将用户表征为“ NORMAL”或“ADMIN”的字段。在Hibernate中,我将使用以下2个对象以(半)类型安全的方式表示此关系: 这行得通,但我发现UserType类过分苛刻,并且为了存储几个值而需要太多的官僚作风。理想情况下,Hibernate应该直接支持枚举字段,并会创建一个

  • 无法获取如何将字符串类型的引用与数组参数中的枚举值一起使用。我可以在items键中进行引用,并且它正在工作,但Swagger产生错误:不是有效的参数定义 Web UI生成界面,但它有文本区,而不是我期望的多选框。 正确的做法是什么? 我的代码: