Prakash P
Prakash P

Reputation: 53

Hibernate MYSQL native query throws ClassCastException

Retrieving integer value from table using Hibernate, following exception occurred,

java.lang.ClassCastException: java.lang.Integer cannot be cast to 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 class format,

    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;
    }
}

If any suggestions for solving this problem

Upvotes: 2

Views: 968

Answers (4)

Alpesh Jikadra
Alpesh Jikadra

Reputation: 1722

If you are retrieving the single column value then ideally you should not go for POJO Class instead of that you can directly cast it to List<Integer>

List<Integer> dobj = query.list();

for(Integer dobj1: dobj) {        
    System.out.println("Value   :: "+dobj1);
}

This will solve your problem

Upvotes: 0

PS Kumar
PS Kumar

Reputation: 2426

You are access particular attribute from the pojo class not an pojo object, then only you are facing java.lang.Integer cannot be cast to pojo.Datasetstatus you can try,

 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());
   }

if you try the above code you will get a answer. or you can try below code as well,

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]);
       }

Upvotes: 1

Vlad Mihalcea
Vlad Mihalcea

Reputation: 153700

You need to change your query to this:

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

The datasetstatusID is an integer not a Datasetstatus.

If you want to return Datasetstatus instead, the your query would be:

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

Upvotes: 1

Tim Biegeleisen
Tim Biegeleisen

Reputation: 520908

There appears to be a problem with your query. You used the following SQL:

SELECT datasetstatusID from datasetstatus where DatasetID = meta_dataset

But you should be using HQL instead:

from datasetstatus d where d.datasetID = meta_dataset

Here is your modified code:

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());
}

Upvotes: 1

Related Questions