【问题标题】:Hibernate MYSQL native query throws ClassCastExceptionHibernate MYSQL 原生查询抛出 ClassCastException
【发布时间】:2015-07-15 00:19:26
【问题描述】:

使用 Hibernate 从表中检索整数值,发生以下异常,

java.lang.ClassCastException: java.lang.Integer 不能转换为 pojo.Datasetstatus

String q1="SELECT datasetstatusID from datasetstatus where DatasetID='"+meta_dataset+"'";
Query query=session.createSQLQuery(q1);
List<Datasetstatus> dobj=query.list();
for(Datasetstatus dobj1: dobj) {        
    System.out.println("Value   :: "+dobj1.getDatasetStatusId());
    }

Pojo 类格式,

    public class Datasetstatus implements java.io.Serializable {

    private Integer datasetStatusId;    
    private String datasetId;

    public Datasetstatus(String datasetId) {
        this.datasetId = datasetId;
    }

    public Integer getDatasetStatusId() {
        return this.datasetStatusId;
    }

    public void setDatasetStatusId(Integer datasetStatusId) {
        this.datasetStatusId = datasetStatusId;
    }

    public String getDatasetId() {
        return this.datasetId;
    }

    public void setDatasetId(String datasetId) {
        this.datasetId = datasetId;
    }
}

如果有解决这个问题的建议

【问题讨论】:

  • 您能否更新您的代码,向我们展示 Pojo 类的所有注释?您的代码在哪一行崩溃?
  • for(Datasetstatus dobj1: dobj) { System.out.println("Value :: "+dobj1.getDatasetStatusId()); },我检查了 for 循环上的代码崩溃(元素检索整数格式)

标签: java mysql sql hibernate orm


【解决方案1】:

您的查询似乎有问题。您使用了以下 SQL:

SELECT datasetstatusID from datasetstatus where DatasetID = meta_dataset

但您应该改用 HQL:

from datasetstatus d where d.datasetID = meta_dataset

这是您修改后的代码:

String q1 = "from datasetstatus d where d.datasetID = :datasetID";
Query query = session.createSQLQuery(q1)
.setParameter("datasetID", meta_dataset);
List<Datasetstatus> dobj = query.list();
for (Datasetstatus dobj1 : dobj) {        
    System.out.println("Value   :: " + dobj1.getDatasetStatusId());
}

【讨论】:

    【解决方案2】:

    您需要将查询更改为:

    List<Integer> dobj=
        (List<Integer>) session.createSQLQuery(
            "SELECT ds.datasetstatusID " +
            "from datasetstatus ds " +
            "where ds.datasetId = :dataSetId")
        .setParameter("dataSetId", meta_dataset)
        .list();
    

    datasetstatusID 是一个整数,而不是 Datasetstatus

    如果您想返回 Datasetstatus,您的查询将是:

    List<Datasetstatus> dobj=
        (List<Datasetstatus>) session.createSQLQuery(
        "SELECT ds " +
        "from datasetstatus ds " +
        "where ds.datasetId = :dataSetId")
    .setParameter("dataSetId", meta_dataset)
    .list();
    

    【讨论】:

      【解决方案3】:

      你是从 pojo 类而不是 pojo 对象访问特定属性,那么只有你面对java.lang.Integer cannot be cast to pojo.Datasetstatus 你可以尝试,

       String q1="SELECT a from datasetstatus as a whereDatasetID='"+meta_dataset+"'";
      Query query=session.createQuery(q1);
          List<Datasetstatus> dobj=(List<Datasetstatus>) query.list();
          for(Datasetstatus dobj1: dobj) {        
              System.out.println("Value   :: "+dobj1.getDatasetStatusId());
         }
      

      如果您尝试上述代码,您将得到答案。或者你也可以试试下面的代码,

      String q1="SELECT a.datasetstatusID from datasetstatus as a whereDatasetID='"+meta_dataset+"'";
          Query query=session.createSQLQuery(q1);
              List<Object[]> dobj=query.list();
              for(Object dobj1: dobj) {        
                  System.out.println("Value   :: "+dobj1.get[0]);
             }
      

      【讨论】:

      • Senthil 将我添加到聊天室后创建聊天室,我无法创建聊天室,需要 100 声望点
      • Senthil 我检查了第一个代码不工作它抛出 java.lang.ClassCastException
      【解决方案4】:

      如果您要检索单列值,那么理想情况下,您不应该使用 POJO 类,而是可以直接将其转换为 List

      List<Integer> dobj = query.list();
      
      for(Integer dobj1: dobj) {        
          System.out.println("Value   :: "+dobj1);
      }
      

      这会解决你的问题

      【讨论】:

      • 我检查了你的代码,但没有工作。发生异常“无法提取结果集”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 2016-10-11
      • 2018-11-30
      相关资源
      最近更新 更多