【问题标题】:How to cast an Object received from SQL Query to a local class object?如何将从 SQL Query 接收到的对象转换为本地类对象?
【发布时间】:2021-05-03 12:43:27
【问题描述】:

我执行一个 SQLQuery 来接收每个名称并计算该名称被调用的次数。从查询中,我得到一个对象类型的列表。我知道查询本身没问题,在数据库上进行了测试,得到了我想要的。

期望的(和收到的)结果:

name count
:name1 :100
:name2 :200

当我尝试将每个 Object 对象(从结果列表中)转换为我的 LocalClass 类型时,我得到:

SEVERE: Servlet.service() for servlet [myWebService] in context with path [/myWebService] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: Cannot cast [Ljava.lang.Object; to com.company.services.EmailBLImpl$1InnerClass] with root cause
java.lang.ClassCastException: Cannot cast [Ljava.lang.Object; to com.company.services.EmailBLImpl$1InnerClass

或者问题应该是如何从 SQL 查询中直接获得 List<InnerClass> list

代码:

@SuppressWarnings("unchecked")
@Override
public void myMethod(User user, Date dateFrom, Date dateUntil) {
    
    @Data
    class InnerClass {
        private String name;
        private Long count;
    }
    
    List<Object> list = sessionFactory
            .getCurrentSession()
            .createSQLQuery("SELECT wsService as service, count(*) as count"
                + " FROM (SELECT * FROM `table` WHERE user=" + user.getId() + ") a" 
                + " GROUP BY wsService"
                + " ORDER BY count DESC")
            .list();    
        
    for (Object o : list) {
        // line below causes the error
        InnerClass ic = InnerClass.class.cast(o);
    }
}

【问题讨论】:

    标签: java mysql sql hibernate casting


    【解决方案1】:

    当我尝试投射时

    我看到了问题。

    那个词(演员)并不意味着你认为它的意思。

    java 有 3 个操作,它们完全、完全、完全、不相关。枪和奶奶。不幸的是,虽然他们的事情完全不相关,但他们都看起来相同:(SomeType) someExpr。这种句法结构被称为cast

    强制转换所做的三件完全不相关的事情中只有一件是转换事物,这就是括号中的类型是原始的。所以,intdouble 等等。强制转换断言或类型检查的所有其他用途,它们无法转换事物。您似乎认为演员可以转换事物。他们不会,除非我们谈论的是原语,Foo.class.cast() 不可能。

    不可能让 JDBC 根据您的对象为您提供数据库结果。期间。

    使用执行此操作的库,例如 JOOQ 或 JDBI。

    【讨论】:

    • 好答案。一些可能有助于 OP 进一步搜索的术语; ORM、对象关系映射、SQL 映射器、休眠、JPA。那些连同提到的 JOOQ 和 JDBI 将获得您正在寻找的转换。或者你只需​​要手动完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多