【问题标题】:Hibernate : java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double休眠:java.lang.ClassCastException:java.lang.Integer 不能转换为 java.lang.Double
【发布时间】:2013-11-15 05:46:53
【问题描述】:

我在 Java 中定义的 Staff Entity 是这样的:

final public class Staff {
    private int staffId;
    private String firstName = null;
    private String lastName = null;
    private String Email = null;
    private double salary;
    //and the setters and getters
}

我的查询代码:

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Staff staff = null;
try {
    Criteria criteria = session.createCriteria(dto.Staff.class);
    criteria.add(Restrictions.eq("salary", 1000000));
    staff = (Staff) criteria.uniqueResult();
} catch(Exception e) {
    System.out.println("Error : " + e);
} finally {
    session.close();
}

但是当我运行它时,我收到一条错误消息:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double

如果我明确地将数字转换为双倍,它会起作用:

criteria.add(Restrictions.eq("salary", (double) 1000000));

有没有办法在没有显式转换的情况下做到这一点? 我还认为在 Java 中,整数到双精度的转换是隐式的?

【问题讨论】:

    标签: java hibernate casting classcastexception


    【解决方案1】:

    Hibernate 认为它是一个整数,告诉它是双精度的。

        criteria.add(Restrictions.eq("salary",   1000000d));
    

    【讨论】:

    • 但是我没有在任何地方使用过 Wrapper 类
    • 有什么办法可以动态地将“d”添加到数字中?因为我正在尝试编写一个应该设置任何类型限制的函数。事实上,它可以是整数或字符串。有什么办法吗?
    • 是的。你可以写new Double(xxx.toString()) - 无论xxxDoubleIntegerString 还是基本上任何可以合理地转换为Double 的东西,这都是正确的。
    【解决方案2】:

    restriction.eq 接受一个对象,因此不可能进行隐式转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 2018-06-25
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      相关资源
      最近更新 更多