【问题标题】:SQLQuery list cast exception after update hibernate 3 to hibernate 5将休眠 3 更新为休眠 5 后 SQLQuery 列表强制转换异常
【发布时间】:2017-05-26 05:53:35
【问题描述】:

将休眠 3 更新为休眠 5 后的 SQLQuery 列表转换异常。这是我的代码

public List<List<String>> getReportQuery(String query) {

    Session sess = getSessionFactory().getCurrentSession();
    final List<List<String>> table = new ArrayList<List<String>>();

    sess.beginTransaction();

    SQLQuery it = sess.createSQLQuery(query);

    table.add(it.list());
    return table;
}

相同的代码在 Hibernate 3 中有效,但在 Hibernate 5 中无效,我尝试将其转换为类似字符串,

List<String> res = it.list();
    for(String s : res){
        List<String> temp = new ArrayList<String>();
        temp.add(s);
        table.add(temp);
    }
}

但同样的异常发生,

[Ljava.lang.Object; cannot be cast to java.lang.String

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    这可能是由于使用了“createSQLQuery()”方法,该方法现在已从 hibernate 5.2 中弃用。检查hibernate docs

    当我们从 hibernate 5.0 升级到 hibernate 5.2 时,我遇到了类似的异常,请参阅下面的堆栈跟踪了解更多详细信息。我的测试用例停止处理这些异常。一旦我用最新的方法替换了不推荐使用的方法,它又开始工作了。

    java.lang.ClassCastException: java.util.GregorianCalendar cannot be cast to java.util.Date
    at org.hibernate.type.descriptor.java.JdbcTimestampTypeDescriptor.unwrap(JdbcTimestampTypeDescriptor.java:24) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.type.descriptor.sql.TimestampTypeDescriptor$1.doBind(TimestampTypeDescriptor.java:48) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:74) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.engine.query.spi.NativeSQLQueryPlan.bindNamedParameters(NativeSQLQueryPlan.java:137) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.engine.query.spi.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:200) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.internal.SessionImpl.executeNativeUpdate(SessionImpl.java:1575) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.query.internal.NativeQueryImpl.doExecuteUpdate(NativeQueryImpl.java:274) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1504) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    

    【讨论】:

      【解决方案2】:

      我通过将it.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); 添加到我的查询实例中解决了这个问题。 这会将结果集转换为地图

      工作代码,

      public List<List<String>> getReportQuery(String query) {
      
              Session sess = getSessionFactory().getCurrentSession();
              final List<List<String>> table = new ArrayList<List<String>>();
              sess.beginTransaction();
      
              SQLQuery it = sess.createSQLQuery(query);
              it.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
              List<Map<String,Object>> result = it.list();
      
              for(Map<String,Object> k : result){
                  final List<String> tmp = new ArrayList<String>();
      
                  for(Entry<String,Object> entry : k.entrySet())
                      tmp.add(entry.getValue() != null ? entry.getValue().toString() : null);
      
                  table.add(tmp);
              }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 2015-08-15
        • 2016-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多